繁体   English   中英

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

[英]How do I get the length of a file with a path longer than 260 characters?

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

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

如果路径的长度大于 260 个字符,则 FileInfo 构造函数将引发 PathTooLongException。 我已经阅读了关于 .NET 中长文件路径的 Kim Hamilton 博客条目,所以我知道如果我放弃框架并使用 Win32 API 调用来完成这一切,它就可以完成。 有没有办法用框架来做到这一点?

.NET 中长文件路径的 Kim Hamilton 博客条目:
第1部分
第2部分
第 3 部分

查看 BCL Codeplex 站点,他们有一个未来的扩展,现在可能对您有所帮助:

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

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

试用 Zeta Long Paths 库:http: //zetalongpaths.codeplex.com/

Microsoft Scripting Runtime COM 参考一起使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM