На System.IO.File
есть статические методы, чтобы получить то, что вы хотите. Это микрооптимизация, но это может быть то, что вам нужно: GetLastAccessTime , GetCreationTime .
Редактировать
Я оставлю текст выше, потому что вы специально попросили статические методы. Тем не менее, я думаю, что вам лучше использовать FileInfo
(вы должны измерить просто чтобы быть уверенным). И File, и FileInfo используют внутренний метод File
, который называется FillAttributeInfo
, чтобы получить данные, которые вы ищете. Для нужных вам свойств FileInfo
нужно будет вызвать этот метод один раз. File
будет вызывать его при каждом вызове, поскольку объект информации атрибута выбрасывается после завершения метода (поскольку он статический).
Так что я догадываюсь, что когда вам нужно несколько атрибутов, FileInfo
для каждого файла будет быстрее. Но в ситуациях с производительностью вы всегда должны измерять! Столкнувшись с этой проблемой, я бы попробовал оба варианта управления, как описано выше, и сделал тест, как при последовательном, так и параллельном запуске. Затем решите, достаточно ли это быстро.
Если это не достаточно быстро, вам нужно обратиться к Win32 API напрямую. Было бы не слишком сложно взглянуть на File.FileAttributeInfo
в справочных источниках и придумать что-то похожее.
2-е редактирование
Фактически, если вам это действительно нужно, это код, необходимый для непосредственного вызова 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;
}
}