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