Question

J'ai le code suivant:

 public static void Serialize()
    {

        List<string> dirs = FileHelper.GetFilesRecursive(fileDirectoryPath);
        List<string> dirFiles = new List<string>();
        foreach (string p in dirs)
        {
            string path = p;

            string lastAccessTime = File.GetLastAccessTime(path).ToString();


            bool DirFile = File.Exists(path);
            FileInfo fInf = new FileInfo(path);
            long lengthInk = fInf.Length / 1024;

            DateTime lastWriteTime = File.GetLastWriteTime(p);
            dirFiles.Add(p + "|" + lastAccessTime.ToString() + "|" + DirFile.ToString() + "|" + lastWriteTime.ToString() + "|" + lengthInk.ToString() + " kb");


        }

Je continue à frapper une erreur de PathTooLongException avec la ligne suivante:

string lastAccessTime = File.GetLastAccessTime(path).ToString();

Les exercices d'application dans un lecteur et trouve tous les fichiers / dossiers w / dans le lecteur. Je ne peux pas changer ce chemin, mais puisqu'il est au-dessus de 260 caractères ... comment contourner cela?

Était-ce utile?

La solution

L'appel GetLastAccessTime(), avec un chemin complet peut dépasser la limite interne (qui est spécifique à la version OS, mais typiquement 260 caractères) sur la longueur maximale pour un chemin de fichier complet.

Une façon d'éviter cela, est d'utiliser Directory.SetCurrentDirectory() pour changer le répertoire du système actuel, puis appeler GetLastAccessTime() avec seulement un chemin relatif. Assurez-vous de changer votre répertoire courant revenir à ce que vous avez commencé à partir pour éviter des problèmes inattendus.

Autres conseils

Quelque chose comme la propriété .LastAccessTime de Delimon.Win32.IO.FileInfo, pourrait faire l'affaire.

Delimon est une bibliothèque sur Microsoft TechNet pour surmonter le problème à long filenames, il est appelé Delimon.Win32.I O Library (V4.0) et il a ses propres versions de classes clés de System.IO

Par exemple, vous devez remplacer:

System.IO.Directory.GetFiles 

avec

Delimon.Win32.IO.Directory.GetFiles

qui vous permettra de gérer les fichiers longs et des dossiers.

Depuis le site Web:

  

Delimon.Win32.IO remplace les fonctions de fichiers de base de System.IO et   prend en charge les noms de fichiers et dossiers jusqu'à jusqu'à 32767 caractères.

     

Cette bibliothèque est écrit sur .NET Framework 4.0 et peut être utilisé   sur les systèmes x86 et x64. Les limitations de fichiers et dossiers de la norme   espace de noms System.IO peut travailler avec des fichiers qui ont 260 caractères dans un   nom de fichier et 240 caractères dans un nom de dossier (MAX_PATH est généralement   configuré en tant que 260 caractères). En général, vous exécutez dans le   Erreur System.IO.PathTooLongException avec la bibliothèque .NET standard.

Microsoft dit ici , il y a une limitation de Windows sur 260 caractères.

Vous pouvez essayer d'éviter cela avec un symbolique lien (pas sûr ...).

.NET ne prend pas en charge les chemins de fichiers Unicode, donc la seule option que je connaisse dans ce cas est d'utiliser P / Invoke (à moins, bien sûr, vous pouvez modifier le chemin) pour appeler les fonctions API Win32 qui ne les prennent en charge. Vous pouvez regarder pour les instructions sur la façon d'utiliser le chemin de fichier Unicode pour rompre la barrière 260 caractères.

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