Как автоматизировать копирование файла со слишком глубокими проблемами path в Windows?

StackOverflow https://stackoverflow.com/questions/236533

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Я написал 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 генерируется более короткий путь.Это также означает, что вы должны копировать свои папки последовательно, чтобы иметь возможность проверять наличие длинных путей перед выполнением команды копирования.

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

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


Редактировать

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

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

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

Другие советы

Робокопия, часть Набор ресурсов Windows, предназначен для обработки таких случаев.

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

Взлом из старых времен заключается в том, чтобы присвоить букву диска части каталога.

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

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

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

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

robocopy empty_dir base_nested_dir /purge
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top