Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here is the extra fast solution, that I finally implemented. Here I am using WinAPI and functions <em>FindFirstFile</em>, <em>FindNextFile</em>. It allows to avoid enumeration of all items in Folder and <strong>stops right after detecting the first object in the Folder</strong>. This approach is ~6(!!) times faster, than described above. 250 calls in 36ms!</p> <pre><code>private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct WIN32_FIND_DATA { public uint dwFileAttributes; public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; public uint nFileSizeHigh; public uint nFileSizeLow; public uint dwReserved0; public uint dwReserved1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string cFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] public string cAlternateFileName; } [DllImport("kernel32.dll", CharSet=CharSet.Auto)] private static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll", CharSet=CharSet.Auto)] private static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll")] private static extern bool FindClose(IntPtr hFindFile); public static bool CheckDirectoryEmpty_Fast(string path) { if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException(path); } if (Directory.Exists(path)) { if (path.EndsWith(Path.DirectorySeparatorChar.ToString())) path += "*"; else path += Path.DirectorySeparatorChar + "*"; WIN32_FIND_DATA findData; var findHandle = FindFirstFile(path, out findData); if (findHandle != INVALID_HANDLE_VALUE) { try { bool empty = true; do { if (findData.cFileName != "." &amp;&amp; findData.cFileName != "..") empty = false; } while (empty &amp;&amp; FindNextFile(findHandle, out findData)); return empty; } finally { FindClose(findHandle); } } throw new Exception("Failed to get directory first file", Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error())); } throw new DirectoryNotFoundException(); } </code></pre> <p>I hope it will be useful for somebody in the future. </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload