解决文件path太长的exception的最佳方法

我创build了一个应用程序,下载SP站点中的所有文档库,但一次它给了我这个错误(我试着看着谷歌,但不能find任何东西,现在如果有人知道任何伎俩来解决这个问题,请回答,否则谢谢看着它)

System.IO.PathTooLongException:指定的path,文件名或这两者太长。 完全限定的文件名必须less于260个字符,且目录名称必须less于248个字符。 System.IO.Path.NormalizePathFast(String path,Boolean fullCheck)System.IO.Path.GetFullPathInternal(String path)在System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights ,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,stringmsgPath,布尔bFromProxy)在System.IO.FileStream.ctor(stringpath,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项)。 IO.File.Create(String path)

它达到string的限制,代码如下,

#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 

由于错误的原因是显而易见的,下面是一些应该帮助您解决问题的信息:

请参阅有关命名文件,path和命名空间的MS文章

以下是该链接的引用:

最大path长度限制在Windows API中(下面讨论的一些例外),path的最大长度是MAX_PATH,定义为260个字符。 本地path按以下顺序组织:驱动器号,冒号,反斜杠,用反斜杠分隔的名称组件以及终止的空字符。 例如,驱动器D上的最大path为“D:\一些256个字符的pathstring<NUL>”,其中“<NUL>”表示当前系统代码页的不可见的终止空字符。 (字符<>在这里用于视觉清晰,不能是有效pathstring的一部分。)

以及几个解决方法(摘自评论):

有办法解决各种问题。 下面列出的解决scheme的基本思想总是相同的:减小path长度以使path-length + name-length < MAX_PATH 。 你可以:

  • 共享一个子文件夹
  • 使用命令行通过SUBST分配驱动器号
  • 使用VB下的AddConnection将一个驱动器号分配给一个path

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

下面是一篇很好的文章,介绍了.NET和PowerShell的这个问题:“. NET,PowerShellpath太长的exception和.NET PowerShell Robocopy克隆 ”

在Windows 8.1上,使用。 NET 3.5,我有一个类似的问题。
虽然我的文件的名字只​​有239个字符长度,当我去实例化FileInfo对象只有文件名(没有path)发生了types系统的exception。 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 

我解决了修剪文件名为204个字符(包括扩展名)的问题。

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

然后键入相对或绝对path:

 mklink ShortPath\To\YourLinkedSolution C:\Path\To\Your\Solution /D 

然后从较短的path启动解决scheme。 这里的优点是:你不需要移动任何东西。

您可以在以下项目中减less项目名称:

 Solution Properties -> Application -> Assembly Name