c# - 为什么 .NET 不能检测具有长文件路径的目录?
问题描述
如果这些文件的完整路径超过 260 个字符,我无法枚举目录中包含的文件。以下代码显示了问题:
void TestLongPath(DirectoryInfo testDirectory)
{
if (testDirectory.Exists)
{
try
{
testDirectory.GetFiles("SomeFileNamePattern*");
}
catch (System.IO.DirectoryNotFoundException)
{
Console.WriteLine("Long path test failed for " + testDirectory.FullName);
}
}
}
我的 app.manifest 文件包含:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
但所做的只是将错误从 PathTooLongException 更改为 DirectoryNotFoundException。
这是我的 App.config:
<?xml version="1.0" encoding="utf-8"?><configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime></configuration>
我在 Windows 10 Pro 上,使用 Visual Studio 2019 16.1.1。我的目标是 .NET 4.7.2。
如何枚举这些超长目录中的文件?它们位于我无法控制的共享网络驱动器上,因此重命名目录不是我的选择。
解决方案
我已经使用这里的信息解决了这个问题:目录的最大字符数或长度是多少?
对于 .NET 4.6.2 或更高版本:App.Config 中的“Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false”无效。
您不需要在路径前加上 \\?\
您确实需要将注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled 设置为 1。
你确实需要
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
在您的 app.manifest 文件中。
即使启用了长路径,此代码似乎总是返回 260:
FieldInfo maxPathField = typeof(Path).GetField("MaxPath",
BindingFlags.Static |
BindingFlags.GetField |
BindingFlags.NonPublic);
int maxPathLength = (int)maxPathField.GetValue(null);
Console.WriteLine("Max path length is " + maxPathLength);
推荐阅读
- python - 绘制大型数据集
- django - ListView的Django动态过滤不起作用
- singlestore - 如何将 memsql 数据行转置为列
- sql - SQL:生成相同的数字直到下一个零
- r - 如何正确使用system2功能
- xamarin.forms - xamarin-essentials 文本到语音“speakasync”不在 IOS 设备中播放音频
- node.js - 猫鼬中的多个填充不起作用
- javascript - Google Places API 调用在使用服务器端代码而不是应用脚本代码调用时返回结果
- sharepoint - SharePoint - 检索文件夹的共享链接
- grep - SUBLIME & GREP:进行 GREP 搜索,但排除所有大写的行