Это моя версия, использующая lseek (не требуется l oop): она полагается на чтение и запись, всегда обрабатывая весь буфер, а не его часть (я не знаю, является ли это гарантировано).
void File_Copy(int sourceFile, int destFile)
{
off_t s = lseek(sourceFile, 0, SEEK_END);
lseek(sourceFile, 0, SEEK_SET);
char* c = malloc(s);
if (read(sourceFile, c, s) == s)
write(destFile, c, s);
free(c);
}
Следующий код не основывается на этом предположении и может также использоваться для файловых дескрипторов, не поддерживающих lseek .
void File_Copy(int sourceFile, int destFile, int n)
{
char* c = malloc(n);
while (1)
{
ssize_t readStatus = read(sourceFile, c, n);
if (readStatus == -1)
{
printf("error, read returned -1, errno: %d\n", errno);
return;
}
if (readStatus == 0)
break; // EOF
ssize_t bytesWritten = 0;
while (bytesWritten != readStatus)
{
ssize_t writeStatus = write(destFile, c + bytesWritten, readStatus - bytesWritten);
if (writeStatus == -1)
{
printf("error, write returned -1, errno is %d\n", errno);
return;
}
bytesWritten += writeStatus;
if (bytesWritten > readStatus) // should not be possible
{
printf("how did 'bytesWritten > readStatus' happen?");
return;
}
}
}
free(c);
}
На моем система (P CIe SSD) Я получаю наилучшую производительность с буфером от 1 до 4 МБ (вы также можете использовать dd, чтобы найти этот размер). Большие буферы не имеют смысла. И вам нужны большие файлы (попробуйте 50 ГБ), чтобы увидеть эффект.