Question

J'utilise un SaveFileDialog et dois définir une chaîne longue (longFileName) dans FileName. La chaîne longFileName est connue à l'exécution.

Si je mets

saveFileDialog.FileName = longFileName ;

alors j'obtiens System.IO.PathTooLongException .

Comment puis-je le faire?

Était-ce utile?

La solution

En bref, vous ne pouvez pas; NTFS a une taille de fichier maximale de 256.

Mon conseil serait de raccourcir votre nom de fichier.

Autres conseils

Bien que vous puissiez avoir des noms de fichiers de plus de 260 caractères, vous pouvez rencontrer quelques problèmes avec l'API. En outre, .net ne le prend pas directement en charge.

Si vous souhaitez plus d'informations, voici un lien vers le premier des trois articles du blog de l'équipe BCL sur le sujet: http://blogs.msdn.com/bclteam/archive/2007/02/ 13 / long-path-in-net-part-1-of-3-kim-hamilton.aspx

La réponse est la suivante:

  

Q: Quel est le nombre maximal de caractères qu'un nom de fichier peut contenir?

     

R: Cela dépend si le fichier est créé sur une partition FAT ou NTFS. La longueur maximale du nom de fichier sur une partition NTFS est de 256 caractères et de 11 caractères sur FAT (nom de 8 caractères, extension de 3 caractères). Les noms de fichiers NTFS conservent leur casse, alors que les noms de fichiers FAT n'ont pas de notion de cas (cependant, le cas est ignoré lors d'une recherche, etc. sur NTFS). Il y a le nouveau VFAT qui a aussi des noms de fichiers de 256 caractères.

Source

En gros, le système d'exploitation détermine la taille de fichier maximale, pas votre application. Si un meilleur système de fichiers, qui prend en charge davantage de caractères, sera rendu disponible à l'avenir, vous pourrez toujours rendre votre logiciel compatible en le permettant en le permettant, et en permettant à l'utilisateur de savoir quand le chemin est trop long pour le moment. Cependant, avec les progrès technologiques actuels, vous ne pouvez pas utiliser un nom de fichier supérieur à 256 caractères.

Vous pouvez essayer la version du chemin d'accès court du nom de fichier en utilisant:

  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  public static extern int GetShortPathName(
     [MarshalAs(UnmanagedType.LPTStr)] System.String path,
     [MarshalAs(UnmanagedType.LPTStr)] System.Text.StringBuilder shortPath,
     System.Int32 shortPathLength);

La boîte de dialogue de sauvegarde du fichier ressemblerait à ceci:

     string long_path = @"C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\1033\vsdebugui.dll";
     StringBuilder s = new StringBuilder(long_path.Length);
     int short_path_length = GetShortPathName(long_path, s, long_path.Length);
     string short_path = s.ToString();
     SaveFileDialog save_d = new SaveFileDialog();
     save_d.FileName = short_path;
     save_d.ShowDialog();

Vous ne pouvez pas.

N'oubliez pas que les chemins d'accès dans Windows doivent comporter moins de 256 caractères. (Sauf si vous utilisez un truc spécial)

Pourquoi voulez-vous un nom de fichier aussi long en premier lieu?

Comme d’autres l’ont mentionné, il n’existe aucun moyen de contourner cette limitation. Cependant, le problème ne vient PAS de NTFS, il est Win32 . En utilisant SFU, vous pouvez créer des chemins ridiculement longs si vous le souhaitez vraiment, mais cela rend l’interopérabilité intéressante avec les éléments Win32 natifs.

Vous voudrez peut-être essayer de préfixer le chemin avec \\? \. Je n’ai jamais essayé avec .NET.

Ajoutez \\? \ au début du chemin. Ainsi, D: \ < very_long_path > deviendrait \\? \ D: \ < very_long_path > . Voir "Référence maximale de longueur de trajet". dans http://msdn.microsoft.com/en-us/library/aa365247. aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top