有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