获取超过260个字符的文件路径过长的安全信息:C#

时间:2018-04-04 23:38:15

标签: c# directoryinfo pathtoolongexception

我正在尝试获取网络文件夹中某些文件和目录的安全信息。不幸的是,一些文件和目录路径分别超过了它们的字符限制260/248。我找到了很多信息来使用Win32 P / Invoke,使用.NET Framework 4.6.2等。我能够使用a code by Kim Hamilton遍历其路径超出长度限制的每个文件和目录,但我无法使用它来获取安全信息。

下面是我的简单C#代码,其中包含一个超过260个字符的路径。它将抛出路径太长的异常。在这种情况下,你能帮我解决一下吗?

using System.IO;
using System.Security.AccessControl;

namespace Microsoft.Experimental.IO
{
    class Program
    {
        public static void Main(string[] args)
        {
            string path = @"\\Domain\UserData\VeryLongPath";  //This is above 260 characters
            DirectoryInfo info = new DirectoryInfo(path);
            DirectorySecurity security = Directory.GetAccessControl(path);

        }
    }
}

2 个答案:

答案 0 :(得分:0)

我在其他一些帖子中看到安装.NET Framework 4.6.2确实有帮助。作为最后的手段,我试过了。我有Visual Studio 2015.我安装了.NET Framework 4.6.2。它仍然无法正常工作。然后我安装了 Visual Studio 2017 并选择了 .NET Framework 4.6.2 。它确实消除了Path Too Long Exception。但它给出了一个名为Invalid name,Invalid parameter的新异常。

我的一位同事建议我检查注册表的价值

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled

它的原始值为0.我将其设置为1.并且Path Too Long和Invalid Name,Invalid参数异常都消失了。我相信在没有.NET Framework 4.6.2的计算机中不存在此注册表项。

答案 1 :(得分:0)

尽管我检查了注册表项(现在看来默认情况下已启用),但是接受的答案对我而言实际上并不起作用。引发的异常如上所述:无效的名称,无效的参数(在我的情况下,发生在SetAccessControl上)。 .NET 4.7.2

特殊语法有帮助:\\?\用于本地路径或\\?\UNC\用于网络共享。

因此,对于所涉及的示例(服务器共享),将类似于以下内容:

var security = Directory.GetAccessControl($@"\\?\UNC\{path.TrimStart('\\')}");