61 votes

Comment éviter System.IO.PathTooLongException?

Nous rencontrons constamment ce problème ...

Exemple:

si j'ai un fichier que je veux le copier dans un autre répertoire ou un partage UNC et si la longueur du chemin dépasse 248 (si je ne me trompe pas), alors il lève PathTooLongException. Y at-il une solution de contournement à ce problème?

PS: Existe-t-il un paramètre de registre permettant de définir ce chemin sur un jeu de caractères plus long?

9voto

ShuggyCoUk Points 24204

Cela a été examiné en profondeur par la BCL équipe, voir les entrées de blog

En substance, il n'y a aucun moyen de le faire à l'intérieur .Net code et le coller à la BCL. Trop de fonctions compter sur d'être en mesure d'accepter le nom de chemin d'accès (ce qui déclenche immédiatement l'utilisation de fonctions attend MAX_PATH être respectées).

Vous pouvez rassembler toutes les fonctions win32 qui prennent en charge le "\\?\" la syntaxe, avec ces vous seriez en mesure de mettre en œuvre une série de long chemin de connaissance de la fonctionnalité, mais ce serait lourd.

Étant donné qu'un grand nombre d'outils (y compris l'explorateur[1]) ne peut pas manipuler des noms de chemin d'accès, il est déconseillé de descendre cette route, sauf si vous êtes heureux que tous interaction avec le fichier résultant système passe au travers de votre bibliothèque (ou le nombre limité d'outils qui sont construits pour le manipuler comme robocopy)

En réponse à votre besoin spécifique, je voudrais étudier si l'utilisation de robocopy directement serait suffisant pour effectuer cette tâche.

[1] Vista a des moyens pour atténuer le problème avec un peu de fantaisie renommer sous le capot, mais c'est fragile, au mieux)

4voto

Brandon Points 7151

Seulement 1 solution de contournement que j'ai vue sur celui-ci ... cela pourrait être utile

http://www.codeproject.com/KB/files/LongFileNames.aspx

3voto

Jason S Points 345

Le problème est avec les versions ANSI de l'Api Windows. Une solution qui doit être testé avec soin est de forcer l'utilisation de l'Unicode des versions de l'API Windows. Cela peut être fait en ajoutant "\\?\" pour le chemin d'accès qui est interrogée.

La grande information, y compris des solutions peuvent être trouvées dans la suite des messages de blog à partir de Microsoft Bibliothèque de classes de Base (BCL) de l'Équipe de intitulée "les Chemins Longs dans .NET":

2voto

A. Harald Points 11

J'ai utilisé la commande "subst" pour contourner le problème ... http://www.techrepublic.com/article/mapping-drive-letters-to-local-folders-in-windows-xp/5975262

0voto

yourmother Points 157

En C # pour moi c'est une solution de contournement:

 /*make long path short by setting it to like cd*/
string path = @"\\godDamnLong\Path\";
Directory.SetCurrentDirectory(path);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X