获取错误指定的路径,文件名或两者都太长

时间:2016-03-12 07:14:47

标签: c# .net

当我通过提供路径保存文件或使用system.io创建目录时,它会给出错误“指定的路径,文件名或两者都太长。完全限定的域名必须为260个字符,目录名称必须为240个字符

1)。我尝试过Delimon库,但它仍然会出现同样的错误。

2)。我试图添加\?\前缀但它会导致非法字符。

3)。我也尝试过://在文件名的开头,但它导致uri不支持错误

现在我的问题是:

1)。是否可以使用System.IO库来使用长路径?

2)。如果您正在通过Delimon库提供解决方案,那么请告诉我可以在共享软件软件中使用此库吗?

提前致谢...

1 个答案:

答案 0 :(得分:0)

基本问题是.NET框架特别不允许使用长文件名,并且会积极地阻止您使用它们。如果没有直接使用Win32 API调用来创建和写入您将无法使用长路径的文件。

根据路径的性质,您可以将其缩短到更短的长度。任何不适合8.3格式的文件或文件夹名称都有缩短版本。您可以使用GetShortPathName API来确定是否存在符合标准限制的简短形式的路径。

示例:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, EntryPoint = "GetShortPathNameW", SetLastError = true)]
static extern int GetShortPathName(string pathName, System.Text.StringBuilder shortName, int cbShortName);

static void Main()
{
    StringBuilder sb = new StringBuilder(300);
    int res = GetShortPathName(
        @"C:\Program Files (x86)\GitHub Extension for Visual Studio\GitHub.VisualStudio.vsix", 
        sb,
        300
    );

    Console.WriteLine(sb.ToString());
}

以上版画:

C:\PROGRA~2\GITHUB~1\GITHUB~1.VSI

这仅适用于存在但可用于至少将文件夹名称缩短到最短级别的文件。对于可能足以让您直接访问文件的临界情况。

如果没有,那么您需要查看某种解决方法。

最简单的方法可能是使用简短的简单路径进行初始保存,然后直接调用Win32 API将文件移动到最终位置,并提供完整的长路径支持。

您也可以尝试NuGet中的Pri.LongPath模块。它允许您使用长文件名,包括移动等等,但我不认为它使您可以在超过260个字符限制时读/写这些文件。试试吧,看看。