我正在处理一个简单的文件资源管理器(),它导致了这个错误,我尝试了一些方法,但无法解决它。
MyCode:
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
我尝试使用以下方法缩短文件路径:
[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文件命名创建的。
这是一些要求的截图。
我在跑:
我的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>更新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,我想我应该再次检查一下最简单的方法,看看是否真的是这样做的:
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生成的超长路径中。
即使是长文件路径,也有解决这个问题的方法吗?
发布于 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提取的)。
我的选择是只抛出一个警告消息框,以迫使用户没有长的文件路径。
发布于 2018-11-23 01:28:13
您可以通过将更改放在AppContext注册表中,使这些切换设置在机器范围内。这样,您就不必手动将重写添加到所有App.config文件中。

如果您需要在.NET Framework4.7中设置一个“true”,这可能特别重要,因为它有一个已知问题,其中在某些解释不清的情况下,开关值被单方面报告为“false”:
致 当程序在注册表中读取AppContext开关的值时,无法检索数据。在这种情况下,假设注册表中指定设置的方式有问题,并将False的值返回给应用程序。
https://stackoverflow.com/questions/53061648
复制相似问题