1

ndk ツールチェーンを使用して次のコードを作成し、Android のファイル操作の容量をテストしています。そして、/data では、読み取りまたは書き込みのパーミッションは間違いなく OK です。しかし、なぜ fopen() が機能せず、NULL を返すのか、私は混乱しています。コードは次のとおりです。

#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void main()
{
    int fd;
    int count = 128;
    int offset = 32;
    int ret;
    char buf[1024]="hi ! this is pwrite.";
    char pathname[128] = "/data/pwrite.txt";
    /*fd = fopen(pathname, O_WRONLY);*/
    FILE *infile;
    infile = fopen(pathname, "rb");
    if(infile==NULL) printf("fopen error  \n");
    /*if(fd==-1)printf("open error \n");*/
    if((ret = pwrite(fd, buf, count, offset))==-1)
    {
        printf("pwrite error\n");
        exit(1);
    }
    else
    {
        printf("pwrite success\n");
        printf("the writed data is:%s", buf);
    }
}

Android でコードを直接実行すると、次のプロンプトが表示されます。

# ./test
fopen error  
pwrite error

何か案は?

4

2 に答える 2

2

ファイルモードの問題に加えて、

"/data/pwrite.txt"

Android アプリケーションのユーザー ID、または (セキュリティで保護されたデバイス上で) adb シェル ユーザーが書き込みのためにアクセスできる場所であってはなりません。

Android 2.2 以降 (ただし、いつでも変更される可能性があります) では、/data/local は adb シェル ユーザーがスクラッチ領域として使用できます。アプリケーション内のコードの場合、各アプリケーションのユーザー ID には、Java レベルの API 呼び出しの 1 つによって見つけられる独自のパッケージ固有のプライベート ストレージ領域があります。パスをハードコードするのではなく、移植性のために実際に使用する必要があります。 .

WRITE_EXTERNAL_STORAGE パーミッションは、内部ストレージの代わりに「外部ストレージ」(デバイスによっては、はんだ付けされているか、実際のリムーバブル カード) を使用する場合にのみ関連します。ここでも、デバイス固有のパスは、/mnt/sdcard のようなものであると仮定するのではなく、API 呼び出しを介して実際に取得する必要があります。

于 2012-06-04T17:21:43.463 に答える
1

ファイルを開くときにモードを指定rbしました。これは、単にバイナリ ファイルを読み取ることを意味します。今、write間違った操作を実行しています。次のように書き込みモードを指定する必要があります。

infile = fopen(pathname, "wb");
于 2012-05-28T03:42:23.480 に答える