有System.IO.File
有静态方法来得到你想要的。这是一个微型优化,但它可能是你需要的:GetLastAccessTime,GetCreationTime。
编辑
我会留下上面的文字,因为您特别要求使用静态方法。不过,我认为你最好使用FileInfo
(你应该确定)。 File和FileInfo都使用内部方法File
,名为FillAttributeInfo
来获取您之后的数据。对于您需要的属性,FileInfo
需要调用此方法一次。 File
将不得不在每次调用时调用它,因为方法结束时属性信息对象被抛弃(因为它是静态的)。
所以我的直觉是,当你需要多个属性时,每个文件的FileInfo
会更快。但在表现情况下,您应该始终衡量!面对这个问题,我会尝试如上所述的两个托管选项,并在串行和并行运行时都做出基准测试。然后决定它是否足够快。
如果速度不够快,则需要直接调用Win32 API。在参考资源中查看File.FileAttributeInfo
并且提出类似的内容并不难。
第二编辑
事实上,如果你真的需要它,这是调用Win32 API直接使用相同的方法,内部代号为File
没有所需的代码,但使用一个操作系统调用来获取所有属性。我认为你应该只使用它,如果它真的需要。你必须从FILETIME解析到一个可用的日期时间,等等,所以你需要做更多的工作来手动完成。
static class FastFile
{
private const int MAX_PATH = 260;
private const int MAX_ALTERNATE = 14;
public static WIN32_FIND_DATA GetFileData(string fileName)
{
WIN32_FIND_DATA data;
IntPtr handle = FindFirstFile(fileName, out data);
if (handle == IntPtr.Zero)
throw new IOException("FindFirstFile failed");
FindClose(handle);
return data;
}
[DllImport("kernel32")]
private static extern IntPtr FindFirstFile(string fileName, out WIN32_FIND_DATA data);
[DllImport("kernel32")]
private static extern bool FindClose(IntPtr hFindFile);
[StructLayout(LayoutKind.Sequential)]
public struct FILETIME
{
public uint dwLowDateTime;
public uint dwHighDateTime;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WIN32_FIND_DATA
{
public FileAttributes dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public int nFileSizeHigh;
public int nFileSizeLow;
public int dwReserved0;
public int dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ALTERNATE)]
public string cAlternate;
}
}
看看通过NuGet的FluentPath。 http://weblogs.asp.net/bleroy/archive/2010/11/19/fluentpath-1-0.aspx – jvanrhyn 2010-12-04 09:16:43
据我所知,这是一个更好的库处理文件路径和linq风格的操作,并没有与引擎盖下的文件元数据有很大关系 – Homde 2010-12-04 09:19:09
如果没有,您是否可以缓存应用程序生命周期开始时的信息?这将在RAM中为您提供信息,但如果您有长时间运行的应用程序将不会更新。 – Patrick 2010-12-04 09:23:49