【问题标题】:PathTooLongException in C# codeC# 代码中的 PathTooLongException
【发布时间】:2009-07-06 15:17:14
【问题描述】:

我有以下代码:

 public static void Serialize()
    {

        List<string> dirs = FileHelper.GetFilesRecursive(fileDirectoryPath);
        List<string> dirFiles = new List<string>();
        foreach (string p in dirs)
        {
            string path = p;

            string lastAccessTime = File.GetLastAccessTime(path).ToString();


            bool DirFile = File.Exists(path);
            FileInfo fInf = new FileInfo(path);
            long lengthInk = fInf.Length / 1024;

            DateTime lastWriteTime = File.GetLastWriteTime(p);
            dirFiles.Add(p + "|" + lastAccessTime.ToString() + "|" + DirFile.ToString() + "|" + lastWriteTime.ToString() + "|" + lengthInk.ToString() + " kb");


        }

我不断遇到以下行的 PathTooLongException 错误:

string lastAccessTime = File.GetLastAccessTime(path).ToString();

应用程序钻入驱动器并查找驱动器中的所有文件/文件夹。我无法更改此路径,但由于它超过 260 个字符...如何解决此问题?

【问题讨论】:

标签: c# pathtoolongexception


【解决方案1】:

带有完整路径的 GetLastAccessTime() 调用可以在完全限定文件路径的最大长度上使用 exceed the internal limit(特定于操作系统版本,但通常为 260 个字符)。

避免这种情况的一种方法是使用Directory.SetCurrentDirectory() 更改当前系统目录,然后仅使用相对路径调用GetLastAccessTime()。只需确保将当前目录改回原来的目录即可,以避免出现意外问题。

【讨论】:

  • 我在研究类似问题时收到了此回复。但我发现 SetCurrentDirectory 也会抛出 PathTooLongExceptipn。我的问题是stackoverflow.com/questions/4050199/…。感谢您拥有的任何 cmet。
  • @Hemal: SetCurrentDirectory() 接受相对路径。您是否尝试过将操作分成两个调用?因此,例如导航到C:\FirstPart\SecondPart\ThirdPart,您可以:SetCurrentDirectory("C:\\FirstPart\\SecondPart"); SetCurrentDirectory(".\\ThirdPart");。通过将目录导航拆分为多个步骤,您可能能够回避路径长度限制。
  • 感谢您的回复。是的,我尝试了相对路径,但是当我达到长度限制时也会出现同样的异常。
【解决方案2】:

类似 Delimon.Win32.IO.FileInfo 的 .LastAccessTime 属性可能会起作用。

Delimon 是 Microsoft TechNet 上的一个库,用于解决长文件名问题,它被称为 Delimon.Win32.I​O Library (V4.0),它有自己的 System.IO 关键类版本

例如,您将替换:

System.IO.Directory.GetFiles 

Delimon.Win32.IO.Directory.GetFiles

这将让您处理长文件和文件夹。

来自网站:

Delimon.Win32.IO 替换了 System.IO 的基本文件功能和 支持最多 32,767 个字符的文件和文件夹名称。

这个库是在 .NET Framework 4.0 上编写的,可以使用 在 x86 和 x64 系统上。标准的文件和文件夹限制 System.IO 命名空间可以处理包含 260 个字符的文件 文件名和文件夹名称中的 240 个字符(MAX_PATH 通常为 配置为 260 个字符)。通常你会遇到 标准 .NET 库发生 System.IO.PathTooLongException 错误。

【讨论】:

  • 昨天遵循了这个建议,但 GetFileSystemInfos() 抛出了未实现的异常。另请阅读它不再维护,而是看到了这个建议:github.com/alphaleonis/AlphaFS
【解决方案3】:

正如微软所说的here,Windows 对 260 个字符有限制。

您可以尝试使用symbolic link 来避免这种情况(不确定...)。

【讨论】:

  • 带有限制的链接实际上包含解决方案(请参阅我对问题的回答)。
【解决方案4】:

.NET 不支持 Unicode 文件路径,因此在这种情况下我知道的唯一选择是使用 P/Invoke(当然,除非您可以更改路径)来调用支持它们的 Win32 API 函数。您可以查看 here 以获取有关如何使用 Unicode 文件路径来打破 260 个字符障碍的说明。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多