134 votes

Meilleure façon de résoudre l'exception du chemin d'accès trop long

J'ai créé une application qui télécharge toutes les bibliothèques de documents d'un site SP, mais à un moment donné, elle me donne cette erreur (j'ai essayé de regarder sur google mais je n'ai rien trouvé, maintenant si quelqu'un connait une astuce pour résoudre ce problème, merci de me répondre sinon merci de regarder).

System.IO.PathTooLongException : Le chemin d'accès spécifié, le nom du fichier ou les deux sont trop longs. Le nom de fichier entièrement qualifié doit être inférieur à 260 caractères et le nom de répertoire doit être inférieur à 248 caractères. at System.IO.Path.NormalizePathFast(String path, Boolean fullCheck) at System.IO.Path.GetFullPathInternal(String path) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at System.IO.File.Create(String path)

il atteint la limite de la chaîne, le code est donné ci-dessous,

#region Downloading Schemes

    private void btnDownload_Click(object sender, EventArgs e)
    {
        TreeNode currentNode = tvWebs.SelectedNode;
        SPObjectData objectData = (SPObjectData)currentNode.Tag;
        try
        {
            CreateLoggingFile();
            using (SPWeb TopLevelWeb = objectData.Web)
            {
                if(TopLevelWeb != null)
                    dwnEachWeb(TopLevelWeb, TopLevelWeb.Title, tbDirectory.Text);
            }
        }
        catch (Exception ex)
        {
            Trace.WriteLine(string.Format("Exception caught when tried to pass TopLevelWeb:{1}, Title = {2}, object data to (dwnEachWeb_method), Exception: {0}", ex.ToString(), objectData.Web, objectData.Title));
        }
        finally
        {
            CloseLoggingFile();
        }
    }

    private void dwnEachWeb(SPWeb TopLevelWeb, string FolderName, string CurrentDirectory)
    {
        if (TopLevelWeb != null)
        {
            if (TopLevelWeb.Webs != null)
            {
                CurrentDirectory = CurrentDirectory + "\\" + TopLevelWeb.Title;
                CreateFolder(CurrentDirectory);
                foreach (SPWeb ChildWeb in TopLevelWeb.Webs)
                {

                    dwnEachWeb(ChildWeb, ChildWeb.Title, CurrentDirectory);
                    ChildWeb.Dispose();
                }
                dwnEachList(TopLevelWeb, CurrentDirectory);
                //dwnEachList(TopLevelWeb, FolderName, CurrentDirectory);
            }
        }
    }

    private void dwnEachList(SPWeb oWeb, string CurrentDirectory)
    {
        foreach (SPList oList in oWeb.Lists)
        {
            if (oList is SPDocumentLibrary && !oList.Hidden)
            {
                dwnEachFile(oList.RootFolder, CurrentDirectory);
            }
        }
    }

    private void dwnEachFile(SPFolder oFolder, string CurrentDirectory)
    {
        if (oFolder.Files.Count != 0)
        {
            CurrentDirectory = CurrentDirectory + "\\" + oFolder.Name;
            CreateFolder(CurrentDirectory);
            foreach (SPFile ofile in oFolder.Files)
            {
                if (CreateDirectoryStructure(CurrentDirectory, ofile.Url))
                {
                    var filepath = System.IO.Path.Combine(CurrentDirectory, ofile.Url);
                    byte[] binFile = ofile.OpenBinary();
                    System.IO.FileStream fstream = System.IO.File.Create(filepath);
                    fstream.Write(binFile, 0, binFile.Length);
                    fstream.Close();
                }
            }
        }
    }

    //creating directory where files will be download        
    private bool CreateDirectoryStructure(string baseFolder, string filepath)
    {
        if (!Directory.Exists(baseFolder)) return false;

        var paths = filepath.Split('/');

        for (var i = 0; i < paths.Length - 1; i++)
        {
            baseFolder = System.IO.Path.Combine(baseFolder, paths[i]);
            Directory.CreateDirectory(baseFolder);
        }
        return true;
    }

    //creating folders
    private bool CreateFolder(string CurrentDirectory)
    {
        if (!Directory.Exists(CurrentDirectory))
        {
            Directory.CreateDirectory(CurrentDirectory);
        }
        return true;
    }

    //shorting string

    #endregion

2voto

Marcel Piquet Points 261

Sous Windows 8.1, en utilisant . NET 3.5, j'ai rencontré un problème similaire.
Bien que le nom de mon fichier ne contienne que 239 caractères, lorsque j'ai essayé d'instancier un objet FileInfo avec seulement le nom du fichier (sans le chemin), une exception de type System s'est produite. IO.PathTooLongException

2014-01-22 11:10:35 DEBUG LogicalDOCOutlookAddIn.LogicalDOCAddIn - fileName.Length: 239 
2014-01-22 11:10:35 ERROR LogicalDOCOutlookAddIn.LogicalDOCAddIn - Exception in ImportEmail System.IO.PathTooLongException: Percorso e/o nome di file specificato troppo lungo. Il nome di file completo deve contenere meno di 260 caratteri, mentre il nome di directory deve contenere meno di 248 caratteri.
   in System.IO.Path.NormalizePathFast(String path, Boolean fullCheck)
   in System.IO.FileInfo..ctor(String fileName)
   in LogicalDOCOutlookAddIn.LogicalDOCAddIn.GetTempFilePath(String fileName) in C:\Users\alle\Documents\Visual Studio 2010\Projects\MyAddin1Outlook20072010\MyAddin1Outlook20072010\LogicalDOCAddIn.cs:riga 692
   in LogicalDOCOutlookAddIn.LogicalDOCAddIn.ImportEmail(_MailItem mailItem, OutlookConfigXML configXML, Int64 targetFolderID, String SID) in C:\Users\alle\Documents\Visual Studio 2010\Projects\MyAddin1Outlook20072010\MyAddin1Outlook20072010\LogicalDOCAddIn.cs:riga 857
   in LogicalDOCOutlookAddIn.LogicalDOCAddIn.ImportEmails(Explorers explorers, OutlookConfigXML configXML, Int64 targetFolderID, Boolean suppressResultMB) in C:\Users\alle\Documents\Visual Studio 2010\Projects\MyAddin1Outlook20072010\MyAddin1Outlook20072010\LogicalDOCAddIn.cs:riga 99

J'ai résolu le problème en réduisant le nom du fichier à 204 caractères (extension comprise).

2voto

Nathaniel Points 105

Si vous avez un problème avec votre poubelle En Visual Studio 2015, vous pouvez aller à la page de propriétés du projet en cause et modifier le chemin relatif de la page de propriétés du projet. Répertoire de sortie à une autre plus courte.

Par exemple poubelle \debug\ devient C:\_bins\MyProject\

2voto

Markus Hooge Points 14

Non mentionné jusqu'à présent et une mise à jour, il y a une bibliothèque très bien établie pour gérer les chemins trop longs. AlphaFS est une bibliothèque .NET qui fournit à la plate-forme .NET des fonctionnalités de système de fichiers Win32 plus complètes que les classes System.IO standard. La lacune la plus notable du System.IO .NET standard est l'absence de prise en charge des fonctionnalités NTFS avancées, notamment la prise en charge des chemins d'accès de grande longueur (par exemple, les chemins d'accès aux fichiers/répertoires de plus de 260 caractères).

0voto

Jatin Nath Prusty Points 353

La meilleure réponse que j'ai trouvée se trouve dans l'un des commentaires ici. Je l'ajoute à la réponse pour que quelqu'un ne manque pas le commentaire et devrait absolument essayer cette solution. Cela a résolu le problème pour moi.

Nous devons faire correspondre le dossier de la solution à un lecteur en utilisant la commande "subst" dans l'invite de commande. par exemple, subst z :

Puis ouvrez la solution à partir de ce lecteur (z dans ce cas). Cela raccourcirait le chemin d'accès autant que possible et pourrait résoudre le problème du nom de fichier trop long.

0voto

user1570636 Points 66

D'après mon expérience, je ne recommanderai pas la réponse ci-dessous pour les applications Web destinées au public.

Si vous en avez besoin pour vos outils internes ou pour des tests, je vous recommande de le partager sur votre propre machine.

-Right click on the root path you need to access
-Choose Properties
-Click on Share button and add your chosen users who can access it

Cela créera alors un répertoire partagé comme \\ {PCName}\{YourSharedRootDirectory} Cela pourrait être beaucoup moins que votre chemin complet, j'espère, pour moi j'ai pu réduire à 30 caractères à partir d'environ 290 caractères :)

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