C#代码中的PathTooLongException

时间:2009-07-06 15:17:14

标签: c# pathtoolongexception

我有以下代码:

 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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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和。的基本文件功能   支持File&amp;文件夹名称最多为32,767个字符。

     

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

正如微软所说的那样here,对于260个字符存在Windows限制。

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