2012-02-08 5 views
1

Может ли кто-нибудь помочь мне в решении? Я не хочу использовать /bin/cp или любые другие зарубежные приложения. Я хочу, чтобы моя программа была независимой. Также я знаю, что каждая система довольно специфична, поэтому я заинтересован в совместимости с UNIX/Linux.Копировать каталог рекурсивно в чистом C на Linux/UNIX

Как его решить? Просто спуститесь в исходный каталог и создайте новые каталоги в целевом и скопируйте в них файлы, или есть лучшее решение?

BTW моя цель: копии всех первых SUBDIRS уровня рекурсивна в целевую директорию, если их нет там

+1

Это домашнее задание? Вы последнее предложение звучит подозрительно. Если это так, отметьте его как таковой. –

+0

Зачем изобретать колесо? Почему бы просто не использовать, например, 'rsync'? –

+0

@NiklasB. спасибо за совет – Uko

ответ

2

Вам действительно нужно какое-то рекурсивного спуска в дерево каталогов. Сделав это, вы можете сделать это очень портативным (используя opendir/readdir на Linux и FindFirstFile/FindNextFile на Windows). Остается проблема с фактическим копированием. Вы можете использовать стандартную библиотеку C для этого с помощью следующего алгоритма:

  • Открытый исходный файл
  • Открыть целевой файл
  • В цикле, fread блок постоянного размера из источника, а затем fwrite его к цель. Прекратите, если исходный файл не содержит никаких данных

Надеется, что это помогает :)

1

Используйте функцию POSIX nftw(3) ходить по дереву, который вы хотите скопировать. Вы предоставляете эту функцию с функцией обратного вызова, которая вызывается по пути каждого файла/каталога. Определите обратный вызов, который копирует файл/dir, который он вызывает, в дерево назначения. Четвертый аргумент обратного вызова типа struct FTW * может использоваться для вычисления относительного пути.

+0

Исправьте меня, если я ошибаюсь, но я не думаю, что вы можете ограничить глубину этой прогулки. –

+0

@NiklasB .: в вашем вопросе не было такого требования. Нет, вы не можете ограничить глубину ходьбы, но вы получите глубину в обратном вызове. –

+0

Это не мой вопрос, но он содержит ограничение «subdirs первого уровня». Спасибо за дополнительную информацию. –

0

Если вы хотите использовать только C, вы можете использовать dirent.h. Используя это, вы можете рекурсивно следовать структуре каталогов. Затем вы можете открыть файлы в двоичном режиме и записать их в нужное место через поток записи.

Смежные вопросы