Android 2.1文件i / o:pread因errno 22而失败(EINVAL,无效参数)

时间:2011-11-07 15:37:56

标签: android android-ndk errno android-2.1-eclair

我正在使用open(2),pread(2)和pwrite(2)进行简单的文件复制操作,如下所示(代码简化了一点)。我的问题是:: pread(2)函数无法返回-1,[errno = 22]。请注意,源文件和目标文件都放在SD卡上。 Android 2.1(API级别< = 7,模拟器和真实设备)都会出现此问题,在Android 2.3(API级别9)上运行时没问题。我的代码中是否存在问题,或者它是kernel / stdlib中的错误?

fileSource = ::open(pcSource, O_RDONLY);
fileDest = ::open(pcDest, O_RDWR|O_TRUNC|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO)

unsigned uiCopyLen = 0;
unsigned uiCopied = 0;
struct stat fileStatus;
fileStatus.st_size = 0;

::fstat(fileSource, &fileStatus);

char * cBuffer = new char[fileStatus.st_blksize];

// ... <in loop>
    ::pread(fileSource, cBuffer, fileStatus.st_blksize, uiCopied);  // errno 22, Invalid argument
    ::pwrite(fileDest, cBuffer, iLen, uiCopied);
// ... </in loop>

另请注意,如果使用read(2),write(2)或切换到流API(fread(3),fwrite(3))可正常工作。奇怪。

0 个答案:

没有答案