我试图在具有深层嵌套文件夹的文件共享中找到特别大的文件。它们不是我的文件夹,所以我不能重新安排它们。获取文件长度的通常方法是:
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中的长文件路径上的博客条目:答案 0 :(得分:4)
查看BCL Codeplex网站,他们的未来扩展可能对您有所帮助:
答案 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