Рекурсивно копировать каталог в чистом C на Linux / UNIX - PullRequest
2 голосов
/ 08 февраля 2012

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

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

Кстати, моя цель: рекурсивно скопировать все поддиректории первого уровня в целевой каталог, если их там нет

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

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

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

Надеюсь, это поможет:)

1 голос
/ 08 февраля 2012

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

0 голосов
/ 09 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...