Рекурсивный MoveFile/CopyFile

Я работаю над консольной программой, и мне нужно использовать MoveFile/CopyFile, чтобы разрешить перемещение и копирование файлов и каталогов (возможно, между томами). Проблема, конечно, в том, что копирование или перемещение каталога на другой том не работает с вышеупомянутыми функциями, потому что они не являются рекурсивными.

SHFileOperation не подойдет, потому что это консольное приложение, и я использую варианты, которые позволяют отображать прогресс (MoveFileWithProgress/CopyFileEx), а SHFileOperation использует графический интерфейс для отображения прогресса вместо консоли.

Я рассматривал возможность использования FindNextFile, но даже тогда не смог найти ни одного примера кода для рекурсивного (Move|Copy)File с FindNextFile или каким-либо другим способом, что немного сбивает с толку, поскольку эта проблема должна возникать раньше.

Есть ли простой способ сделать это или мне нужно прибегнуть к изобретению велосипеда?


person Synetech    schedule 01.07.2012    source источник
comment
Вы уверены, что они не рекурсивны? В MSDN четко указано, что вы можете указать путь к каталогу, и что The MoveFile function will move (rename) either a file or a directory (including its children). Однако обратите внимание на это заявление об отказе от ответственности: If a file is moved across volumes, MoveFile does not move the security descriptor with the file (также в MSDN).   -  person Eran Zimmerman Gonen    schedule 07.08.2012
comment
@Eran, в нем конкретно говорится MoveFile функция не будет выполняться при перемещении каталога, если место назначения находится на другом томе.   -  person Synetech    schedule 07.08.2012
comment
конечно, я неправильно прочитал это... Я немного погуглил, и кажется, что люди говорят, что перемещение не работает, а копирование и удаление работает, но я не нашел реальных объяснений, как копировать. Кажется, вы должны просто написать рекурсивную функцию самостоятельно (или взять ее из Интернета - много таких вокруг). Другой способ (не такой хороший, ИМО, но все же возможный) — прочитать и записать всю папку, примерно так, как описано здесь: stackoverflow.com/questions/5520481/   -  person Eran Zimmerman Gonen    schedule 08.08.2012
comment
@Eran, написание рекурсивной функции возможно, но раздражает, поскольку она должна использовать FindNextFile и тому подобное и кажется «неуклюжей». Я не против этого (может быть, таким образом я смогу добавить больше гибкости), но я просто подумал, что наверняка должен быть какой-то более простой встроенный способ выполнить такую ​​очевидную и относительно распространенную задачу, а не просто изобретать велосипед. , что является настоящей анафемой в мире программирования.   -  person Synetech    schedule 08.08.2012