2011-09-22 139 views
2

要超过c#中的最大路径限制,您显然需要将驱动器路径与@"\\?\"连接起来。如果我这样做,那么我与在前面避免最大字符数限制c#

\\\\?\\\\\\server\\share\\...

现在如果我期待已久的文件/文件夹,因为在路径非法charachters它会失败以下驱动器路径(我假设?)那么我如何才能正确地采用微软网站(http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx)中列出的方法?

foreach (string filePath in Directory.GetFiles(folder)) 
{ 
    String s = @"\\?\" + filePath; 

    if (filePath.Length > 255) 
    { 
     Console.WriteLine(filePath); 
    } 

    if (File.Exists(filePath)) 
    { 
     FileInfo finfo = new FileInfo(s); 
     folderSize += finfo.Length; 
    } 
} 

foreach (string dir in Directory.GetDirectories(folder)) 
    folderSize += GetDirectorySize(dir); 
+0

你可以在你尝试使用长路径的地方显示一些代码吗?你是在创建一个文件或文件夹还是读取嵌套在很长路径中的现有文件?阅读下面的答案。 –

+0

我想计算一组共享驱动器的大小,它们在某些情况下非常大,因此路径通常超过255个字符 – James

回答

1

我不认为你应该路径前添加所有的斜杠,我想你不明白一切什么是写在MSDN这里:

最大路径长度限制

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

注:文件I /在Windows API转换O功能“/”到“\”的一部分 将名称转换为NT样式的名称,除非使用前缀 “\?\”前缀,如以下各节中所述。

Windows API有很多功能,它们的Unicode版本也有 允许最大总长度为 32,767个字符的扩展长度路径。此类路径由用反斜杠分隔的组件 组成,每个组件由GetVolumeInformation 函数(此值通常为255个字符)的 lpMaximumComponentLength参数返回的值。要指定 扩展长度路径,请使用“\?\”前缀。例如,“\?\ D:\很 长路径”。

注:的32,767个字符的最大路径是近似的,因为 的“\ \?”前缀可以由系统在 运行时可扩展到更长的字符串,而且这种扩张适用于总长度。

,你可以从中读到,:

Windows API的有很多功能也使用Unicode版本 允许扩展长度路径的 32,767个字符的最大路径总长度。

这是您的问题的关键,如果您需要创建或访问超过260个字符的路径,您应该使用特定的Windows API。

+2

而且您需要直接(即P/Invoke)API:.NET类不支持扩展长度路径(就像它们不支持备用数据流一样)。 – Richard

+0

任何想法哪一个具体请:) – James

+0

显示您的代码编辑您的问题上面。我们必须看到你在做什么才能提出更换建议。这里没有水晶球... –

2

标准System.IO不支持超过260个字符的路径。

但似乎有一个与扩展长度路径支持库: http://alphafs.codeplex.com/

我个人还没有尝试过这么远。