解决文件路径过长异常的最佳方法

Muh*_*aja 92 .net c# string sharepoint file

我创建了一个应用程序,下载SP站点中的所有文档库,但有一次它给了我这个错误(我试着看谷歌但无法找到任何东西,现在如果有人知道解决这个问题的任何技巧,请回复否则谢谢看着它)

System.IO.PathTooLongException:指定的路径,文件名或两者都太长.完全限定的文件名必须少于260个字符,目录名必须少于248个字符.在System.IO.Path.NormalizePathFast(字符串路径,布尔fullCheck)在System.IO.Path.GetFullPathInternal(字符串路径)在System.IO.FileStream.Init(字符串路径,的FileMode模式,FileAccess的访问,权限的Int32,布尔useRights ,文件共享份额,缓冲区大小的Int32,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,字符串MSGPATH,布尔bFromProxy)在System.IO.FileStream..ctor(在系统字符串路径,的FileMode模式,FileAccess的访问,文件共享份额,缓冲区大小的Int32,FileOptions选项). IO.File.Create(String path)

它达到字符串的限制,代码如下,

#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
Run Code Online (Sandbox Code Playgroud)

Jam*_*ill 52

由于错误的原因很明显,这里有一些信息可以帮助您解决问题:

请参阅此MS文章,了解命名文件,路径和命名空间

以下是该链接的引用:

最大路径长度限制在Windows API中(以下段落中讨论了一些例外),路径的最大长度为MAX_PATH,定义为260个字符.本地路径按以下顺序构成:驱动器号,冒号,反斜杠,由反斜杠分隔的名称组件以及终止空字符.例如,驱动器D上的最大路径是"D:\某个256个字符的路径字符串<NUL>",其中"<NUL>"表示当前系统代码页的不可见的终止空字符.(这里使用字符<>是为了清晰,不能成为有效路径字符串的一部分.)

以及一些解决方法(摘自评论):

有办法解决各种问题.下面列出的解决方案的基本思想始终是相同的:减少路径长度以便拥有path-length + name-length < MAX_PATH.你可以:

  • 共享一个子文件夹
  • 使用命令行通过SUBST分配驱动器号
  • 在VB下使用AddConnection为路径分配驱动器号

  • 很明显,但没有任何意义.为什么有路径大小限制??? 这是2017年. (15认同)
  • @TimeToThine,你读过我发布的文章吗?你看过评论了吗?我可能是错的,但除了我已经提供的内容之外,我认为你不会从SO社区获得任何帮助. (7认同)
  • 文章似乎已经更新:`从 Windows 10 版本 1607 开始,MAX_PATH 限制已从常见的 Win32 文件和目录函数中删除。` 但您必须选择加入,并设置一个注册表项以启用它。 (4认同)
  • 是的我在发布问题之前已经读过了,我甚至试过"\\?\"但是由于某些原因它在这种情况下不起作用.我发现这个博客,使用它,但由于某种原因它不能正常工作,"http://www.codinghorror.com/blog/2006/08/shortening-long-file-paths.html"我还在寻找一些保持不变的东西保存的目录,我可以从那里,或类似的东西,例如使用隐藏的标签来保存当前目录而不是字符串,但不知道它是否会起作用. (2认同)
  • 如果我使用Directory.SetCurrentDirectory()将当前目录更改为该文件夹的目录,它将避免此限制.或者问题是否仍然存在. (2认同)

Tim*_*wis 23

有一个名为Zeta Long Paths的库,它提供了一个.NET API来处理长路径.

这是一篇很好的文章,涵盖.NET和PowerShell的这个问题:". NET,PowerShell路径太长的异常和.NET PowerShell Robocopy克隆 "


goo*_*ify 18

对我有用的解决方案是编辑注册表项以启用长路径行为,将该值设置为1。这是Windows 10的新选择启用功能

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)

我从@ james-hill发布的文章的命名部分中获得了此解决方案。

https://docs.microsoft.com/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

  • 我已将其设置为 1,但仍然收到错误,此时不知道为什么。 (6认同)
  • @OndraStarenko xml 位于应用程序清单文件中。有关详细信息,请参阅[应用程序清单](https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests)。您需要将“longPathAware”添加到应用程序的清单文件中。例如,如果在 Visual Studio 中从“C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”打开 PowerShell.exe,则可以查看应用程序清单。并在 exe 中查看此设置。 (3认同)
  • 文章提到了两个要求。首先是注册表项,其次是应用程序 xml:`&lt;application xmlns="urn:schemas-microsoft-com:asm.v3"&gt; &lt;windowsSettings xmlns:ws2="https://schemas.microsoft.com/SMI/2016 /WindowsSettings"&gt; &lt;ws2:longPathAware&gt;true&lt;/ws2:longPathAware&gt; &lt;/windowsSettings&gt; &lt;/application&gt;` 对于使用 Visual Studio 2019 的我来说,重新启动 Visual Studio 后不需要第二个要求。 (2认同)
  • 链接到汤姆·安德森提到的更多详细信息:https://docs.microsoft.com/de-de/windows/win32/fileio/maximum-file-path-limitation#enable-long-paths-in-windows-10-version -1607-及之后 (2认同)

Mar*_*ber 7

您可以使用较短的目录创建符号链接。首先打开命令行,例如Shift + RightClick在您想要的文件夹中使用较短的路径(您可能必须以管理员身份运行它)。

然后输入相对或绝对路径:

mklink ShortPath\To\YourLinkedSolution C:\Path\To\Your\Solution /D
Run Code Online (Sandbox Code Playgroud)

然后从较短的路径开始解决方案。这里的优点是:您不必移动任何东西。


Lac*_*lov 5

对我有用的是将我的项目移动到桌面上的项目 (C:\Users\lachezar.l\Desktop\MyFolder) 到 (C:\0\MyFolder),如您所见,它使用较短的路径并减少它解决了问题。