Вот Вам Native решение:
| Код | public const int MAX_PATH = 260; public const int MAX_ALTERNATE = 14;
[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; }
[DllImport("kernel32", CharSet=CharSet.Unicode)] public static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32", CharSet=CharSet.Unicode)] public static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);
private long RecurseDirectory(string directory, int level, out int files, out int folders) { IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); long size = 0; files = 0; folders = 0; Kernel32.WIN32_FIND_DATA findData;
IntPtr findHandle;
findHandle = Kernel32.FindFirstFile(@"\\?\" + directory + @"\*", out findData); if (findHandle != INVALID_HANDLE_VALUE) {
do { if ((findData.dwFileAttributes & FileAttributes.Directory) != 0) {
if (findData.cFileName != "." && findData.cFileName != "..") { folders++;
int subfiles, subfolders; string subdirectory = directory + (directory.EndsWith(@"\") ? "" : @"\") + findData.cFileName; if (level != 0) // allows -1 to do complete search. { size += RecurseDirectory(subdirectory, level - 1, out subfiles, out subfolders);
folders += subfolders; files += subfiles; } } } else { // File files++;
size += (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296; } } while (Kernel32.FindNextFile(findHandle, out findData)); Kernel32.FindClose(findHandle);
}
return size; }
|
Взято http://www.pinvoke.net/default.aspx/kernel32/FindFirstFile.html. У меня результаты тестов были такие:
| Цитата | GetDirSize - Native. Dir to scan: C:\ Size: 17,1 GB Time: 11s GetDirSize - Managed. Dir to scan: C:\ Size: 17,1 GB Time: 11s
|
Выбирать Вам |