Как вы автоматизируете копирование файла с путями слишком глубоких проблем в Windows? - PullRequest
4 голосов
/ 25 октября 2008

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

Edit: Я должен дать понять, что я хочу только выборочно копировать файлы, а не папки. Я не думаю, что robocopy можно эффективно использовать для копирования отдельного файла и его структуры папок.

Ответы [ 5 ]

8 голосов
/ 25 октября 2008

Robocopy, входящий в состав Windows Resource Kit , предназначен для таких случаев.

3 голосов
/ 25 октября 2008

Вы хотите реализовать процедуру копирования для себя? Если да, то вы пробовали UNC-пути? Мне никогда не приходилось с ними работать, но проще говоря, вы используете префикс, и путь может быть намного длиннее, чем MAX_PATH, как описано в этой статье MSDN .

2 голосов
/ 25 октября 2008

Я написал VBscript, который проверяет длину пути и вызывает subst, как только достигается определенный порог. Эти вызовы накладываются друг на друга, так что в середине рекурсии существует такой макет:

C:\a\very\long\path
subst K: "C:\a\very\long\path"

K:\another\very\long\path
subst L: "K:\another\very\long\path"

L:\yet\another\very\long\path
subst M: "L:\yet\another\very\long\path"

xcopy M:\*.* "D:\target"

Таким образом, с каждым уровнем субстрата генерируется более короткий путь. Это также означает, что вы должны копировать свои папки последовательно, чтобы иметь возможность проверять длинные пути перед тем, как выполнить команду копирования.

Как только все файлы в папке скопированы, рекурсия возвращается на один уровень назад (subst /d), освобождая одну букву диска.

Используя 4-5 букв дисков, которые заменяют друг друга, когда путь становится глубоким, я смог скопировать пути, длина которых превышала предел MAX_PATH.


EDIT

Здесь описана общая процедура выполнения с помощью subst. То, как вы это делаете, зависит от ваших потребностей, я всегда использовал этот маленький подвох в минимуме, «решая эту единственную проблему».

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

Распаковка всех файлов .zip в пределах одной глубоко вложенной структуры каталогов может потребоваться только в стеке, но вам нужно немного сократить порог для учета папок в .zip и т. Д.

1 голос
/ 25 октября 2008

Хак с давних времен - назначить букву диска части каталога.

Одной из опций является команда SUBST. Это позволит вам заменить букву диска на комбинацию буквы и пути. Я видел это в установочных пакетах, чтобы получить более короткую версию каталога.

В качестве альтернативы вы можете использовать общую папку и сопоставить ее с буквой диска. Или вы можете использовать административный ресурс.

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

0 голосов
/ 23 июля 2010

Как предположил Сорен, попробуйте Robocopy:

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