PathTooLongException在C#代码(PathTooLongException in

2019-06-25 04:08发布

我有以下代码:

 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();

该应用程序钻入一个驱动器,并找到所有文件/文件夹W /驱动器中。 我不能改变这条道路,但因为它是以上260个字符...如何解决此问题?

Answer 1:

所述GetLastAccessTime()调用,以全路径可以超过内部限制上的最大长度(这是特定于操作系统的版本,但通常260个字符),用于一个完全合格的文件路径。

避免这种情况的一种方法,是使用Directory.SetCurrentDirectory()来改变当前的系统目录,然后调用GetLastAccessTime()只有一个相对路径。 只要确保你改变当前目录回你从开始如何避免意外的问题。



Answer 2:

喜欢的东西.LastAccessTime Delimon.Win32.IO.FileInfo的财产,可能做的伎俩。

Delimon是克服长文件名的问题,这就是所谓的在Microsoft TechNet库Delimon.Win32.I O库(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错误。



Answer 3:

作为微软称这里 ,对260个字符的Windows限制。

你可以尽量避免这种用符号链接 (不知道...)。



Answer 4:

.NET不支持Unicode文件路径,所以唯一的选择我在这种情况下知道的是使用P / Invoke(除非,当然,你可以改变路径)来调用那些支持他们的Win32 API函数。 你可以看看这里了解如何使用Unicode文件路径突破260个字符屏蔽指令。



文章来源: PathTooLongException in C# code