Ввод / вывод файла Android 2.1: pread завершается с ошибкой 22 (EINVAL, неверный аргумент) - PullRequest
2 голосов
/ 07 ноября 2011

Я делаю простую операцию копирования файла, используя open (2), pread (2) и pwrite (2), как показано ниже (код немного упростился).Моя проблема в том, что функции :: pread (2) не могут вернуть -1, с [errno = 22].Обратите внимание, что исходный и целевой файлы размещаются на SD-карте.Эта проблема возникает в Android 2.1 (уровень API <= 7, эмулятор и реальное устройство), без проблем при запуске в Android 2.3 (уровень API 9).Есть ли проблема в моем коде или это ошибка в ядре / stdlib?</p>

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)) работает правильно.Странно.

...