C#GetDirectories()System.IO.DirectoryNotFoundException:&x27;找不到路径的一部分

C#GetDirectories()System.IO.DirectoryNotFoundException:&x27;找不到路径的一部分,c#,C#,我正在处理一个简单的文件资源管理器exe,这导致了这个错误,我尝试了一些方法,但无法解决它 霉菌代码: private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo) { TreeNode aNode; DirectoryInfo[] subSubDirs; foreach (DirectoryInfo subDir in subDirs) { aNode = n

我正在处理一个简单的文件资源管理器exe,这导致了这个错误,我尝试了一些方法,但无法解决它

霉菌代码:

private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
{
    TreeNode aNode;
    DirectoryInfo[] subSubDirs;
    foreach (DirectoryInfo subDir in subDirs)
    {
        aNode = new TreeNode(subDir.Name, 0, 0);
        aNode.Tag = subDir;
        aNode.ImageKey = "folder";

        subSubDirs = subDir.GetDirectories();
        if (subSubDirs.Length != 0)
        {
            GetDirectories(subSubDirs, aNode);
        }
        nodeToAddTo.Nodes.Add(aNode);
    }
}
但是我得到了这个错误:

System.IO.DirectoryNotFoundException HResult=0x80070003
Message=找不到路径的一部分 “C:\Users\zero\u 000\Documents\DAZ 3D\Studio\My Library\data\DAZ3D-G3 超级英雄套装\24205-超级连体衣休闲风格 纹理\IM00024205-01\U SuperbodySuiteCasualStyleTextures\Content\People\Genesis 3男式\服装\超级连体衣\面料\休闲风格\ 3Delight
Source=mscorlib

我已尝试使用以下方法缩短文件路径:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern int GetShortPathName(
        [MarshalAs(UnmanagedType.LPTStr)]
        string path,
        [MarshalAs(UnmanagedType.LPTStr)]
        StringBuilder shortPath,
        int shortPathLength
    );
但这只会导致另一个本质上相同的问题

怎么解决这个问题

[更新1] 程序应该检查我拥有的每个文件和文件夹,有时名称很长,它们不是由我创建的,而是由安装程序或其他用户的zip文件命名创建的

这里有一些截图

我在跑:

  • Win 10 Pro(64位)
  • VS2017
  • .NET Framework 4.7.1
我的App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/>
    </startup>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
  </runtime>
</configuration>
在这种情况下,它似乎不会产生任何错误

[更新4] 显然,如果我执行da.GetDirectories()它将立即抛出错误,因为从该路径收集的任何目录都将添加到DirectoryInfo生成的超长路径中


即使文件路径很长,是否仍有解决方法?

确定。在我测试了一点之后。 我注意到没有直接的答案,因为整个问题都是由于文件路径长

我测试了路径“C:\Users\zero\u 000\Documents\DAZ3D~1\Studio\MYLIBR~1\data\DAZ3D-~1\24205-~1\IM0002~1\Content\People\GENESI~1\countain\SUPERB~1\matri~1\CASUAL~1\3Delight”,这是由文件资源管理器生成的较短版本

如果我导航到此文件夹,它会工作。 但是,如果我试图在这个文件夹中创建一个文件夹,它只会向我抛出一个与我的C#App中显示的错误类似的错误

这意味着,根据我的员工或任何用户的默认行为,他们甚至无法达到这个阶段。(除非像我一样,此文件夹是通过7zip提取的)


我的选择是抛出一个警告消息框,强制用户不要有长文件路径。

您可以通过将更改放入Windows注册表,在机器范围内切换这些
AppContext
设置。这样,您就不必手动将覆盖添加到所有App.config文件中

如果您需要在.NET Framework 4.7中将开关设置为“true”,这可能特别相关,因为在某些解释不当的情况下,开关值会单方面报告为“false”:

原因
当程序读取注册表中AppContext开关的值时,无法检索数据。在这种情况下,假定注册表中指定设置的方式有问题,并将值返回给应用程序。


你如何调用你的函数?你是在给它一根粗线吗?否则,请尝试使用“\\”而不是“\”。请更新您的问题,以包含命令提示符的屏幕截图,该命令提示符已
cd
ed插入该文件夹。换句话说,请向我们证明该文件夹存在。路径看起来很长,这可能是问题的原因。有两种方法可以解决这个问题。你能试试中的一些建议吗?这是一个很好的路径字符串。它在winapi中超过了MAX_DIR 254个字符。并且总是最大路径,259个字符。当您尝试访问该目录中的文件时。当然,有很多方法可以通过选择更好的名称使这个字符串更实用。这些截图都不能证明具有确切名称的文件夹存在。
DirectoryInfo da = new DirectoryInfo(@"C:\Users\zero_000\Documents\DAZ3D~1\Studio\MYLIBR~1\data\DAZ3D-~1\24205-~1\IM0002~1\Content\People\GENESI~1\Clothing\SUPERB~1\MATERI~1\CASUAL~1\3Delight");
Console.WriteLine(@"C:\Users\zero_000\Documents\DAZ3D~1\Studio\MYLIBR~1\data\DAZ3D-~1\24205-~1\IM0002~1\Content\People\GENESI~1\Clothing\SUPERB~1\MATERI~1\CASUAL~1\3Delight");

DirectoryInfo db = new DirectoryInfo(@"C:\Users\zero_000\Documents\DAZ 3D\Studio\My Library\data\DAZ3D - G3 Superhero Pack\24205 - Super Bodysuit Casual Style Textures\IM00024205-01_SuperBodysuitCasualStyleTextures\Content\People\Genesis 3 Male\Clothing\Super Bodysuit\Materials\Casual Style\3Delight");
Console.WriteLine(@"C:\Users\zero_000\Documents\DAZ 3D\Studio\My Library\data\DAZ3D - G3 Superhero Pack\24205 - Super Bodysuit Casual Style Textures\IM00024205-01_SuperBodysuitCasualStyleTextures\Content\People\Genesis 3 Male\Clothing\Super Bodysuit\Materials\Casual Style\3Delight");