Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从PathTooLongException检索路径信息_C#_.net_Windows_Path_Pathtoolongexception - Fatal编程技术网

C# 从PathTooLongException检索路径信息

C# 从PathTooLongException检索路径信息,c#,.net,windows,path,pathtoolongexception,C#,.net,Windows,Path,Pathtoolongexception,我正在使用.Net 4.0中的DirectoryInfo和FileInfo枚举目录树中的文件,并点击PathTooLongException。简化版如下 公共静态类测试 { 公共静态无效搜索(DirectoryInfo库) { foreach(base.GetFiles()中的var文件) { 尝试 { Console.WriteLine(file.FullName); }捕获(PathToolOngEx异常) { //这是哪条路? } } foreach(base.GetDirectories

我正在使用.Net 4.0中的DirectoryInfo和FileInfo枚举目录树中的文件,并点击PathTooLongException。简化版如下

公共静态类测试
{
公共静态无效搜索(DirectoryInfo库)
{
foreach(base.GetFiles()中的var文件)
{
尝试
{
Console.WriteLine(file.FullName);
}捕获(PathToolOngEx异常)
{
//这是哪条路?
}
}
foreach(base.GetDirectories()中的var dir)
{
搜索(dir);
}
}
}
当抛出错误时,我想知道是什么文件路径导致了问题。显然,我不能要求全名,因为这是错误的。我可以从
文件中获取名称。名称
,但如果我无法获取路径的其余部分,则作为
文件。目录
会给出一个
路径工具异常
,即使从中找到该文件的
目录信息
工作正常!(但我不能使用它,因为实际的代码要复杂得多)

通过堆栈跟踪查看,它似乎使用了一个内部路径(我在debug中看到一个受保护的
file.FullPath
),并试图从完整(超大)路径中删除目录。大多数问题似乎涉及到
System.IO.Path.NormalizePath
,我听说在.NET4.0中进行了一些更改。我没有尝试过该框架的以前版本

我的问题是:

  • 如何从该异常获取完整路径;它似乎是在没有任何有用信息的情况下传递的
  • 为什么框架需要限制路径中的字符来切掉文件名
  • 提前感谢您的帮助,

    Andy

    除了使用反射,或者使用库或p/Invoke来使用支持长路径和手动检查长度的Windows API之外,我想不出任何其他方法。完整路径存储在名为
    FullPath

    foreach(var dir in new DirectoryInfo (@"D:\longpaths")
                         .GetFileSystemInfos("*.*", SearchOption.AllDirectories))
    {
        try
        {
            Console.WriteLine(dir.FullName);
        }
        catch (PathTooLongException)
        {
                    FieldInfo fld = typeof(FileSystemInfo).GetField(
                                            "FullPath", 
                                             BindingFlags.Instance | 
                                             BindingFlags.NonPublic);
                    Console.WriteLine(fld.GetValue(dir));  // outputs your long path
        }
    }
    
    如果您试图对文件执行某些操作,而不仅仅是检查文件长度,我建议您使用像这样的库,但是它不会创建
    DirectoryInfos
    FileInfo
    FileSystemInfo
    ,只创建字符串。因此,它似乎并不能替代您的代码

    至于你第二个问题的答案,我建议你阅读.NET中处理长路径的文章。这是一段引文,解释了为什么他们没有在.NET中快速添加长路径支持

    很少有人抱怨32K的限制,所以,问题解决了吗?不完全是。过去我们不愿意添加长路径有几个原因,以及为什么我们仍然对此保持谨慎,这与安全性、Windows API中对\?\语法的不一致支持以及应用程序兼容性有关


    这是一个由3部分组成的系列文章,解释了API之所以如此以及存在局限性的几个原因。

    感谢Christopher,我担心会出现这种情况。私自持有路径,不允许在未首先验证的情况下访问它,这似乎很愚蠢……尽管它为我创建了无效路径。您指向的
    LongPath
    库看起来很棒!不幸的是,我忘了提到所有的路径都是UNC的,所以现在还不能使用。查看代码以了解如何实现DirectAPI将非常有用。@Andyrooger,是的,我忘记了。我把代码分叉,并在不久前添加了它。你可以得到密码。使用源代码,而不是版本,我修复了一个愚蠢的错误。@ChristopherCurrens+1作为FieldInfo提示!