System.IO.PathTooLongException

Signaler
Messages postés
66
Date d'inscription
samedi 24 février 2007
Statut
Membre
Dernière intervention
7 octobre 2007
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour, dans une ligne comme celle ci :

FileInfo infoFichierLocal = newFileInfo(pathLocal + cheminLocal);

Il m'arrive d'obtenir une exception de type : System.IO.PathTooLongException.
pathLocal + cheminLocal fait 261 caractères, donc logique que l'exception sois levé. Mais pourquoi j'arrive à aller jusqu'au fichier en utilisant l'explorateur de fichiers de Windows ?  Ce fichier éxiste bien, sont chemin dois donc faire moins de 260 caractères !!! Quand j'essai de renomer le fichier en question je vois qu'il reste juste assez de place pour 3 caractères, après windows refuse la frappe au clavier.

Comment je peut acceder à un fichier sur le disque dur, en sachant que sont chemin + nom de fichier + extension sont très proche de la limite maximal ?

Merci de vos réponses.

A plus.

7 réponses

Messages postés
195
Date d'inscription
dimanche 10 février 2002
Statut
Membre
Dernière intervention
16 février 2016

Je n'ai pas vraiment de solution a t'apporter, mais est ce qu'avec un .cmd qui copie ce fichier ailleurs plante aussi ?
Si il ne plante pas, regarde quelle API copie les fichiers et vois si tu peux l'utiliser.

Enfin, je dis peut être quelques chose de très crade

RodCobalt22, vous salue bien
Pensez au TAG résolu ! Ainsi les réponses seront plus facile à trouver et les serial Helper iront plus vite
 PS : Pardonnez mes fautes d'orthographe (All
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Il te faut obtenir le nom du fichier court, dans le systeme de fichier, tu as deux formats, un long, pour nous les hommes, et un cours, comme on peux voir dans les commandes DOS

<hr />I love .net
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Pour obtenir le nom cours d'un fichier :

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError=true)]
        static extern int GetShortPathName(
            [MarshalAs(UnmanagedType.LPTStr)] string lpszLongPath,
            [MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszShortPath,
            int cchBuffer);
        public static string ToShortPathName(string longName)
        {
            StringBuilder shortNameBuffer = new StringBuilder(256);
            int bufferSize = shortNameBuffer.Capacity;


            int result = GetShortPathName(longName, shortNameBuffer, bufferSize);


            return shortNameBuffer.ToString();
        }

Je ne sais pas s'il existe la même tout fait en Managed...







<hr />

I love .net
Messages postés
66
Date d'inscription
samedi 24 février 2007
Statut
Membre
Dernière intervention
7 octobre 2007

Salut, Yxion, ton code me renvoi des chaines vides pour les chemins qui me posaient problèmes.

Dommage, ca avais l'air prometeur.

A plus.
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

C'est bizarre, ca devrait te renvoyer la chaine de la table du système de fichier... tu l'as testée en placant directement ton chemin complet @"C:\...exe" sans montages, juste en prenant le chemin dans l'explorateur?

<hr />I love .net
Messages postés
66
Date d'inscription
samedi 24 février 2007
Statut
Membre
Dernière intervention
7 octobre 2007

Salut, Ton code marche bien mais seulement avec les chemins courts.

De plus, après y avoir regardé de plus près, j'ai trouvé la source de mon erreure.

Je recupère de chemin de moins de 260 caractères, du genre "C:\blablabla\ ...\...\..;\Nom de fichiers.txt" et j'essai de le sauvegarder sur un autre ordinateur. Du coup ca me donnais des chemin du genre : "10.0.0.4\Lecteur de sauvegarde\blablabla\ ...\...\..;\Nom de fichiers.txt". Alors ca pouvais pas marché.

A plus.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Les chemins longs (préfixés par "\\?") ne sont effectivement pas supportés.
Si ton but est la copie de fichier, tu peux peut être appliquer un des exemples donnés sur le blog du team BCL :
http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx
http://blogs.msdn.com/bclteam/archive/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx

/*
coq
MVP Visual C#
CoqBlog
*/