Как я могу копировать файлы в C без зависимости от платформы? - PullRequest
9 голосов
/ 24 июля 2011

Похоже, этот вопрос довольно прост, но я не могу найти четкого решения для копирования файлов в C без зависимости от платформы.

Я использовал системный вызов () в своем проекте с открытым исходным кодом для созданиякаталог, копирование файлов и запуск внешних программ.Он очень хорошо работает в Mac OS X и других системах Unix, но не работает в Windows.Проблема была:

system( "cp a.txt destination/b.txt" );
  • Windows использует обратную косую черту для разделителя пути.(против косой черты в Unix)
  • Windows использует команду «copy» для внутренней команды копирования.(против cp в Unix-ish)

Как я могу написать код копирования без зависимости?

(На самом деле, я написал макросы для решения этой проблемы, но это не круто. http://code.google.com/p/npk/source/browse/trunk/npk/cli/tests/testutil.h, L22-56)

Ответы [ 3 ]

9 голосов
/ 24 июля 2011

Функция system() доставляет гораздо больше хлопот, чем стоит; он вызывает оболочку в отдельном процессе, и обычно его следует избегать.

Вместо fopen() a.txt и dest/b.text и используйте getc() / putc() для выполнения копирования (поскольку стандартная библиотека с большей вероятностью выполнит буферизацию на уровне страницы, чем вы)

FILE *src = fopen("a.txt", "rb");
FILE *dst = fopen("dest/b.txt", "wb");
int i;
for (i = getc(src); i != EOF; i = getc(src))
{
    putc(i, dst);
}
fclose(dst);
fclose(src);
6 голосов
/ 24 июля 2011

Вам необходимо использовать функции стандартной библиотеки C в stdio.h .

В частности, fopen, fread, fwrite и fclose будет достаточно.

Обязательно включите параметр b ("двоичный") в флаги для fopen.

[править]

К сожалению, сами имена файлов (прямые и обратные косые черты) по-прежнему зависят от платформы. Так что вам понадобится какой-то #ifdef или подобный, чтобы справиться с этим.

Или вы можете использовать кроссплатформенный инструментарий .

0 голосов
/ 24 июля 2011

Используйте стандартную библиотеку C stdio.h. Сначала откройте входной файл для чтения с помощью fopen(inputFilename, "rb") и откройте выходной файл для записи с помощью fopen(outputFilename, "wb"), скопируйте содержимое с помощью fread и fwrire. Затем закройте оба файла, используя fclose.

...