2012-05-28 74 views
0

大家好!我使用ndk工具鏈構建以下代碼來測試android文件操作的容量。 而且,在/ data中,讀或寫的權限無疑是OK。但是,我感到困惑,fopen()不起作用並返回NULL。 下面是代碼:android文件操作,打開,失敗

#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 

任何想法THX

+0

嘗試char pathname [128] =「//data//pwrite.txt」 ; – Lucifer

+0

我有嘗試你的想法,但它也失敗了。但是,無論如何thx。任何其他的想法? –

+0

okey,請試試這個'infile = fopen(* pathname,「rb」);' – Lucifer

回答

1

你給rb模式,同時打開?文件,這僅僅意味着讀取二進制文件。現在您正在執行write這是錯誤的操作。你應該給寫入方式如下,

infile = fopen(pathname, "wb"); 
1

除了你的文件模式的問題,

"/data/pwrite.txt" 

不應該寫入的位置accessable通過一個Android應用程序的用戶ID,甚至(在安全設備)adb shell用戶。

由於大約android 2.2以上(但隨時可能更改),adb shell用戶可以將/ data/local用作臨時區域。對於應用程序中的代碼,每個應用程序用戶標識具有它自己的程序包唯一的私有存儲區域,可以通過java級別的api調用找到 - 我認爲它類似於getFilesDir() - 您應該使用它來實現可移植性,而不是硬編碼路徑。

只有當您希望使用「外部存儲」(取決於可能焊接的設備或實際的可移動卡)而不是內部存儲時,WRITE_EXTERNAL_STORAGE權限纔有用。還有,你應該真的通過api調用獲取設備特定路徑,而不是不可移植地假設它是類似於/ mnt/sdcard