首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# GetDirectories() System.IO.DirectoryNotFoundException:“找不到路径的一部分

C# GetDirectories() System.IO.DirectoryNotFoundException:“找不到路径的一部分
EN

Stack Overflow用户
提问于 2018-10-30 09:56:43
回答 2查看 3.9K关注 0票数 2

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

MyCode:

代码语言:javascript
复制
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 'C:\Users\zero_000\Documents\DAZ 3D\Studio\My Library\data\DAZ3D - G3超级英雄包\24205-超级紧身套装Textures\IM00024205-01_SuperBodysuitCasualStyleTextures\Content\People\Genesis 3男装\超级紧身衣\材料\休闲风格\3 3Delight‘的一部分Message=Could没有找到。 Source=mscorlib

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

代码语言:javascript
复制
[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文件命名创建的。

这是一些要求的截图。

截图:来自我的IDE的错误

屏幕截图:当我从资源管理器打开时存在的文件夹

截图:当我从CMD访问时似乎找不到的路径。

我在跑:

  • Win 10 Pro (64位)
  • VS2017
  • .NET框架4.7.1

我的App.config:

代码语言:javascript
复制
<?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>

更新2好吧,你们中的一些人可能不明白我想展示的东西。基本上,这就是问题所在,我正在编写的C#桌面应用程序会因为文件路径太长而抛出一个错误嫌疑人。

但有趣的是。在我的c#代码中,.GetDirectories()的嵌套函数不断深入到子文件夹中。因此,它产生了一个长的文件路径。但它抛出并出错,如上所示。

Textures\IM00024205-01_SuperBodysuitCasualStyleTextures\Content\People\Genesis VS.NET 2017:"C:\Users\zero_000\Documents\DAZ 3D\Studio\My Library\data\DAZ3D - G3超级英雄包\24205-超级男装休闲风格VS.NET 3男装\超级紧身套装\材料\休闲风格\3快感“

但是,当我将此路径粘贴到Win10Pro中的Windows中时,它会自动将路径更改为较短的版本。它可以显示文件夹和内容。

"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“Win10 Explorer

然后,我将相同的路径粘贴到CMD中,它也会显示错误,因为它说路径不存在(如上面的屏幕快照所示)。

更新3,我想我应该再次检查一下最简单的方法,看看是否真的是这样做的:

代码语言:javascript
复制
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");

在这种情况下,它似乎不会产生任何错误。

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

即使是长文件路径,也有解决这个问题的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-31 07:52:51

好的。在我测试过一段时间之后。我注意到这一点没有直接的答案,因为整个问题都是由长文件路径造成的。

我测试了path "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“,它是文件资源管理器生成的较短版本。

如果我导航到这个文件夹,它就能工作。但是,如果我试图在这个文件夹中创建一个文件夹,它只会向我抛出一个与我的C#应用程序中显示的错误有点相似的错误。

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

我的选择是只抛出一个警告消息框,以迫使用户没有长的文件路径。

票数 2
EN

Stack Overflow用户

发布于 2018-11-23 01:28:13

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

如果您需要在.NET Framework4.7中设置一个“true”,这可能特别重要,因为它有一个已知问题,其中在某些解释不清的情况下,开关值被单方面报告为“false”:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53061648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档