2

我有以下代码:

 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 个字符...如何解决此问题?

4

4 回答 4

4

GetLastAccessTime()具有完整路径的调用可能会超过完全限定文件路径的最大长度的内部限制(特定于操作系统版本,但通常为 260 个字符)。

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

于 2009-07-06T15:27:06.847 回答
2

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

Delimon 是 Microsoft TechNet 上的一个库,用于克服长文件名问题,它被称为Delimon.Win32.IO 库 (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 错误。

于 2013-02-16T05:58:49.080 回答
0

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

于 2009-07-06T15:19:07.890 回答
0

正如 Microsoft 所说 Windows 对 260 个字符有限制。

您可以尝试使用符号链接来避免这种情况(不确定...)。

于 2009-07-06T15:21:18.543 回答