C# Comment puis-je résoudre les limitations lors de l'utilisation de DirectoryInfo?

Quand je récursive à travers des dossiers et des fichiers, je rencontre cette erreur:

Le chemin d'accès spécifié, le nom de fichier, ou les deux sont trop longs. Le nom de fichier complet doit être inférieure à 260 caractères, et le nom du répertoire doit être de moins de 248 caractères.

Voici ma fonction

private void ProcessDirectory(DirectoryInfo di)
{
    try
    {
        DirectoryInfo[] diArr = di.GetDirectories();

        foreach (DirectoryInfo directoryInfo in diArr)
        {
            if (StopCheck)
                    return;
            ProcessDirectory(directoryInfo);
        }
        ProcessFile(di);
    }
    catch (Exception e)
    {
        listBoxError.Items.Add(e.Message);
    }

    TextBoxCurrentFolder.Text = di.ToString();
}

Je ne peut pas créer le répertoire des noms plus courts, parce que je n'ai pas le droit de trop donc... Comment puis-je résoudre ce problème?

Ajouté:
Voici l'autre fonction:

private void ProcessFile(DirectoryInfo di)
{
    try
    {
        FileInfo[] fileInfo = di.GetFiles();

        if (fileInfo.LongLength != 0)
        {
            foreach (FileInfo info in fileInfo)
            {
                Size += info.Length;
                CountFile++;
            }
        }
    }
    catch (Exception e)
    {
        listBoxError.Items.Add(e.Message);
    }
}

MODIFIER
Trouvé où il a utilisé Zeta Longs trajets:
Comment puis-je utiliser la classe FileInfo, en évitant PathTooLongException?

Ont mis en œuvre, et maintenant, je vais laisser le programme exécuté au cours de la nuit pour voir si elle fonctionne.

MODIFIER
Utilisé le ZetaLongPath hier et il fonctionnait très bien! Il est même allé à travers les dossiers qui avaient besoin de l'autorisation d'accès.

MODIFIER
Au lieu de zetalongPath, j'ai utilisé Delimon.Win32.IO.dll je pense que c'est beaucoup mieux. Il a les mêmes interfaces que Win32.

Je suppose que vous devez retourner à la plaine de l'API Windows (FindFirst*/FindNext*)
Si l'erreur se produit de l'intérieur ProcessFile(), peut-être que le code peut être modifié si l'on peut les voir?
Vous savez que vous êtes le premier à le plus profond sous-dossier avant de commencer à traiter les fichiers?! Si vous souhaitez commencer avec la rootfolder vous devez déplacer ProcessFile(di); le début de la méthode.
Musefan: Non, le problème ne se produit pas. Bien sûr 🙂 ajout de la fonction
Tim: Oui, je sais, suis dit que je devrais commencer à partir de la plus profonde en premier.

OriginalL'auteur Phu Minh Pham | 2012-03-06