2008-10-25 5 views
4

Je veux être capable de copier sélectivement une liste de fichiers et de préserver leur structure de répertoires. Le problème est qu'il existe un certain nombre de fichiers dont le chemin dépasse 256 caractères. Comment ce problème est-il habituellement traité?Comment automatiser le fichier de copie avec le chemin des problèmes trop profonds dans Windows?

Modifier: Je devrais préciser que je veux seulement copier sélectivement des fichiers, pas des dossiers. Je ne pense pas que robocopy puisse être utilisé efficacement pour copier un fichier individuel et sa structure de dossiers efficacement.

Répondre

2

J'ai écrit un VBscript qui vérifie la longueur du chemin et appelle subst, dès qu'un certain seuil est atteint. Ces appels sont empilés les uns sur les autres de sorte que, au milieu d'une récursion, cette disposition existe:

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" 

De cette façon, à chaque niveau de Subst, un chemin plus court est généré. Cela signifie également que vous devez copier vos dossiers de manière séquentielle, afin de pouvoir vérifier les longs chemins avant d'exécuter la commande de copie.

Une fois tous les fichiers d'un dossier copiés, la récursivité recule d'un niveau (subst /d), libérant ainsi une lettre de lecteur.

En utilisant 4 à 5 lettres de lecteur, qui se succèdent lorsque le chemin devient trop profond, j'ai pu copier des chemins dont la longueur dépassait la limite MAX_PATH.


EDIT

Il décrit la procédure générale de le faire avec subst. Comment vous le faites dépend de vos besoins, j'ai toujours utilisé ce petit truc secondaire dans un minimum, "résout ce problème" seul moyen. Par exemple, la copie vers un chemin cible également profond signifie que vous avez besoin d'une autre pile de lettres de lecteur substituées.

Déballer tous les fichiers .zip dans une structure de répertoire unique, profondément imbriqué peut exiger que sur la pile, mais vous devez raccourcir le seuil un peu pour tenir compte des dossiers dans le fichier .zip, etc.

8

Robocopy, partie du Windows Resource Kit, est conçu pour gérer de tels cas.

+0

Tout comme un ajout, Robocopy fait partie de Windows Vista (et probablement de Sever 2008 et toute version ultérieure de Windows). – OregonGhost

+0

Je ne lis peut-être pas la documentation correctement, mais je ne vois pas comment vous pouvez utiliser robocopy pour copier sélectivement un seul fichier et sa structure de répertoire. Je l'ai testé sur un répertoire avec un chemin profond mais il semble que seuls les répertoires puissent être spécifiés et non des fichiers spécifiques. – llamaoo7

3

Voulez-vous implémenter la procédure de copie pour vous-même? Si oui, avez-vous essayé les chemins UNC? Je n'ai jamais eu à travailler avec eux, mais mettez simple vous utilisez un préfixe et le chemin peut être beaucoup plus long que MAX_PATH, comme décrit in this MSDN article.

1

Un hack de l'ancien temps consiste à attribuer une lettre de lecteur à une partie du répertoire.

Une option est la commande SUBST. Cela vous permettra de substituer une lettre de lecteur pour une lettre de lecteur et une combinaison de chemins. J'ai vu cela fait dans les paquets d'installation pour obtenir une version plus courte du répertoire.

Alternativement, vous pouvez utiliser un dossier partagé et l'associer à une lettre de lecteur. Ou vous pouvez utiliser le partage administratif.

Mais vraiment si vous avez du code que vous pouvez exécuter, alors il est beaucoup mieux que ces hacks.

0

Søren suggéré, essayez Robocopy:

robocopy empty_dir base_nested_dir /purge 
Questions connexes