如何获取路径长度超过260个字符的文件的长度?

时间:2010-07-05 20:05:58

标签: c# windows path

我试图在具有深层嵌套文件夹的文件共享中找到特别大的文件。它们不是我的文件夹,所以我不能重新安排它们。获取文件长度的通常方法是:

string fullPath = "C:\path\file.ext";
FileInfo info = new FileInfo(fullPath);
long len = info.Length;

如果路径的长度大于260个字符,则FileInfo构造函数会抛出PathTooLongException。我已经在.NET中的长文件路径上阅读了Kim Hamilton博客条目,所以我知道如果我放弃框架并使用Win32 API调用完成所有操作就可以完成。有没有办法用框架来做?

Kim Hamilton在.NET中的长文件路径上的博客条目:
Part 1
Part 2
Part 3

4 个答案:

答案 0 :(得分:4)

查看BCL Codeplex网站,他们的未来扩展可能对您有所帮助:

http://bcl.codeplex.com/wikipage?title=Long%20Path

答案 1 :(得分:3)

Windows支持的路径长度超过260.但是,此功能不会直接通过.NET公开。要获取路径长于260的文件的长度,请使用GetFileAttributesEx Windows API函数,该函数可以通过编组在.NET中访问:

[StructLayout(LayoutKind.Sequential)]
public struct WIN32_FILE_ATTRIBUTE_DATA
{
    public FileAttributes dwFileAttributes;
    public FILETIME ftCreationTime;
    public FILETIME ftLastAccessTime;
    public FILETIME ftLastWriteTime;
    public uint nFileSizeHigh;
    public uint nFileSizeLow;
}

public enum GET_FILEEX_INFO_LEVELS {
    GetFileExInfoStandard,
    GetFileExMaxInfoLevel
}

public class MyClass
{
    [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
    private static extern bool GetFileAttributesEx(string lpFileName,
          GET_FILEEX_INFO_LEVELS fInfoLevelId, out WIN32_FILE_ATTRIBUTE_DATA fileData);

    public static long GetFileLength(string path)
    {
         // Check path here

         WIN32_FILE_ATTRIBUTE_DATA fileData;

         // Append special suffix \\?\ to allow path lengths up to 32767
         path = "\\\\?\\" + path;

         if(!GetFileAttributesEx(path,
                 GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, out fileData))
         {
               throw new Win32Exception();
         }
         return (long)(((ulong)fileData.nFileSizeHigh << 32) +
                        (ulong)fileData.nFileSizeLow);
    }
}

答案 2 :(得分:1)

试用Zeta长路径库:http://zetalongpaths.codeplex.com/

答案 3 :(得分:0)

使用Microsoft Scripting Runtime COM参考

var fso = new Scripting.FileSystemObject();
double fileSize = fso.GetFile(path).Size;  // path is over 300 chars