{"id":4010,"date":"2024-11-14T11:52:55","date_gmt":"2024-11-14T15:52:55","guid":{"rendered":"https:\/\/www.wholetomato.com\/blog\/?p=4010"},"modified":"2026-05-12T14:03:52","modified_gmt":"2026-05-12T18:03:52","slug":"how-to-query-file-attributes-50x-faster-on-windows","status":"publish","type":"post","link":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/","title":{"rendered":"How to Query File Attributes 50x faster on Windows"},"content":{"rendered":"<p><b>TL;DR<\/b><\/p>\n<p><span style=\"font-weight: 400;\">If your app scans thousands of files, the way you fetch file attributes can quietly destroy performance. Standard methods like\u00a0<\/span><code>GetFileAttributesEx<\/code>\u00a0<span style=\"font-weight: 400;\">or even <\/span><span style=\"background-color: #f2f4f5; color: #222222;\">std::filesystem<\/span><span style=\"font-weight: 400;\">\u00a0a<\/span><span style=\"font-weight: 400;\">re convenient but painfully slow at scale. By switching to faster Windows APIs like <code>FindFirstFileEx<\/code> or <\/span><span style=\"background-color: #f2f4f5; color: #222222;\">GetFileInformationByHandleEx\u00a0<\/span><span style=\"font-weight: 400;\">, you can retrieve attributes while iterating directories, cutting expensive system calls and achieving speedups of 50x or more.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The real win? Combine faster APIs with smart strategies like caching, and your file-heavy workflows go from sluggish to lightning-fast without changing core logic.\u00a0<\/span><\/p>\n<p>Imagine you&#8217;re developing a tool that needs to scan for file changes across thousands of project files. Retrieving file attributes efficiently becomes critical for such scenarios. In this article, I&#8217;ll demonstrate a technique to get file attributes that can achieve a surprising speedup of over 50+ times compared to standard Windows methods.<\/p>\n<p>Let&#8217;s dive in and explore how we can achieve this.<\/p>\n<p><strong><em>This is a blog post made in collaboration with Bartlomiej Filipek from C++ stories. You can visit his blog <a href=\"https:\/\/www.cppstories.com\/p\/start-here\/\">here<\/a>.<\/em><\/strong><\/p>\n<h2 id=\"the-inspiration--disclaimer\">The inspiration<\/h2>\n<p>The inspiration for this article came from a recent update for Visual Assist &#8211; a tool that heavily improves Visual Studio experience and productivity for C# and C++ developers.<\/p>\n<p>In one of their blog post, they shared:<\/p>\n<blockquote><p>The initial parse is 10..15x faster!<\/p><\/blockquote>\n<p><a href=\"https:\/\/www.wholetomato.com\/blog\/2024\/02\/21\/whats-new-in-visual-assist-2024-featuring-lightning-fast-parser-performance-webinar\/\">What\u2019s New in Visual Assist 2024\u2014Featuring lightning fast parser performance [Webinar] &#8211; Tomato Soup<\/a><\/p>\n<p>After watching the webinar, I noticed some details about efficiently getting file attributes and I decided to give it a try on my machine. In other words I tried to recreate their results.<\/p>\n<p><strong>Disclaimer<\/strong>: Idera, the company behind Visual Assist, helped me write this post and sponsored it.<\/p>\n<h2 id=\"understanding-file-attribute-retrieval-methods-on-windows\">Understanding File Attribute Retrieval Methods on Windows<\/h2>\n<p>On Windows, there are at least a few options to check for a file change:<\/p>\n<ul>\n<li><code>FindFirstFile[EX]<\/code> &#8211; with Basic, Standard and LargeFetch options<\/li>\n<li><code>GetFileAttributesEx<\/code><\/li>\n<li><code>std::filesystem<\/code><\/li>\n<li><code>GetFileInformationByHandleEx<\/code><\/li>\n<\/ul>\n<p>Below, you can see some primary usage of each approach:<\/p>\n<h3 id=\"findfirstfileex\"><code>FindFirstFileEx<\/code><\/h3>\n<p><code>FindFirstFileEx<\/code> is a Windows API function that allows for efficient searching of directories. It retrieves information about files that match a specified file name pattern. The function can be used with different information levels, such as <code>FindExInfoBasic<\/code> and <code>FindExInfoStandard<\/code>, to control the amount of file information fetched.<\/p>\n<pre><code class=\"language-cpp\">WIN32_FIND_DATA findFileData;\r\nHANDLE hFind = FindFirstFileEx((directory + \"\\\\*\").c_str(), FindExInfoBasic, &amp;findFileData, FindExSearchNameMatch, NULL, 0);\r\n\r\nif (hFind != INVALID_HANDLE_VALUE) {\r\n    do {\r\n        \/\/ Process file information\r\n    } while (FindNextFile(hFind, &amp;findFileData) != 0);\r\n    FindClose(hFind);\r\n}\r\n<\/code><\/pre>\n<p>Additionally you can also pass <code>FIND_FIRST_EX_LARGE_FETCH<\/code> as the additional flag to indicate that the function should use a larger buffer which might bring some extra performance.<\/p>\n<h3 id=\"getfileattributesex\"><code>GetFileAttributesEx<\/code><\/h3>\n<p><code>GetFileAttributesEx<\/code> is another Windows API function that retrieves file attributes for a specified file or directory. Unlike <code>FindFirstFileEx<\/code>, which is used for searching and listing files, <code>GetFileAttributesEx<\/code> is typically used for retrieving attributes of a single file or directory.<\/p>\n<pre><code class=\"language-cpp\">WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;\r\nif (GetFileAttributesEx((directory + \"\\\\\" + fileName).c_str(), GetFileExInfoStandard, &amp;fileAttributeData)) {\r\n    \/\/ Process file attributes\r\n}\r\n<\/code><\/pre>\n<h3 id=\"getfileinformationbyhandleex\"><code>GetFileInformationByHandleEx<\/code><\/h3>\n<p><code>GetFileInformationByHandleEx<\/code> is a low level routine that might be tricky to use, but gives us more control over the iteration. The main idea is to get a lerge buffer of data and read it on the application side, rather than rely on sometimes costly kernel\/system calls.<\/p>\n<p>Assuming you have a file open, which is a directory, you can iterate over its children in the following way:<\/p>\n<pre><code class=\"language-cpp\">while (true) {\r\n    if (!GetFileInformationByHandleEx(\r\n        hDir,\r\n        FileFullDirectoryInfo,\r\n        pInfo,\r\n        sizeof(buffer))) {\r\n        DWORD error = GetLastError();\r\n        if (error == ERROR_NO_MORE_FILES) {\r\n            break;\r\n        }\r\n        else {\r\n            std::wcerr &lt;&lt; L\"GetFileInformationByHandleEx failed (\" &lt;&lt; error &lt;&lt; L\")\\n\";\r\n            break;\r\n        }\r\n    }\r\n\r\n    do {\r\n        if (!(pInfo-&gt;FileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)) {\r\n            FileInfo fileInfo;\r\n            fileInfo.fileName = std::wstring(pInfo-&gt;FileName, pInfo-&gt;FileNameLength \/ sizeof(WCHAR));\r\n            FILETIME ft{};\r\n            ft.dwLowDateTime = pInfo-&gt;LastWriteTime.LowPart;\r\n            ft.dwHighDateTime = pInfo-&gt;LastWriteTime.HighPart;\r\n            fileInfo.lastWriteTime = ft;\r\n            files.push_back(fileInfo);\r\n        }\r\n        pInfo = reinterpret_cast&lt;FILE_FULL_DIR_INFO*&gt;(\r\n            reinterpret_cast&lt;BYTE*&gt;(pInfo) + pInfo-&gt;NextEntryOffset);\r\n    } while (pInfo-&gt;NextEntryOffset != 0);\r\n}\r\n<\/code><\/pre>\n<h3 id=\"stdfilesystem\"><code>std::filesystem<\/code><\/h3>\n<p>Introduced in C++17, the <code>std::filesystem<\/code> library provides a modern and portable way to interact with the file system. It includes functions for file attribute retrieval, directory iteration, and other common file system operations.<\/p>\n<pre><code class=\"language-cpp\">for (const auto&amp; entry : fs::directory_iterator(directory)) {\r\n    if (entry.is_regular_file()) {\r\n        \/\/ Process file attributes\r\n        auto ftime = fs:last_write_time(entry);\r\n        ...\r\n    }\r\n}\r\n<\/code><\/pre>\n<h2 id=\"the-benchmark\">The Benchmark<\/h2>\n<p>To evaluate the performance of different file attribute retrieval methods, I developed a small benchmark. This application measures the time taken by each method to retrieve file attributes for N number of files in a specified directory.<\/p>\n<p>Here&#8217;s a rough overview of the code:<\/p>\n<p>The <code>FileInfo<\/code> struct stores the file name and last write time.<\/p>\n<pre><code class=\"language-cpp\">struct FileInfo {\r\n    std::wstring fileName;\r\n    std::variant&lt;FILETIME, std::filesystem::file_time_type&gt; lastWriteTime;\r\n};\r\n<\/code><\/pre>\n<p>Each retrieval technique will have to go over a directory and build a vector of <code>FileInfo<\/code> objects.<\/p>\n<h4 id=\"benchmarkfindfirstfileex\">BenchmarkFindFirstFileEx<\/h4>\n<pre><code class=\"language-cpp\">void BenchmarkFindFirstFileEx(const std::string&amp; directory, \t\r\n                              std::vector&lt;FileInfo&gt;&amp; files, \r\n                              FINDEX_INFO_LEVELS infoLevel) \r\n{\r\n   WIN32_FIND_DATA findFileData;\r\n   HANDLE hFind = FindFirstFileEx((directory + \"\\\\*\").c_str(),\r\n                                   infoLevel, \r\n                                   &amp;findFileData, \r\n                                   FindExSearchNameMatch, NULL, 0);\r\n\r\n   if (hFind == INVALID_HANDLE_VALUE) {\r\n       std::cerr &lt;&lt; \"FindFirstFileEx failed (\" \r\n                 &lt;&lt; GetLastError() &lt;&lt; \")\\n\";\r\n       return;\r\n   }\r\n\r\n   do {\r\n       if (!(findFileData.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)) {\r\n           FileInfo fileInfo;\r\n           fileInfo.fileName = findFileData.cFileName;\r\n           fileInfo.lastWriteTime = findFileData.ftLastWriteTime;\r\n           files.push_back(fileInfo);\r\n       }\r\n   } while (FindNextFile(hFind, &amp;findFileData) != 0);\r\n\r\n   FindClose(hFind);\r\n}\r\n<\/code><\/pre>\n<h4 id=\"benchmarkgetfileattributesex\">BenchmarkGetFileAttributesEx<\/h4>\n<pre><code class=\"language-cpp\">void BenchmarkGetFileAttributesEx(const std::string&amp; directory,\r\n                                  std::vector&lt;FileInfo&gt;&amp; files) \r\n{\r\n   WIN32_FIND_DATA findFileData;\r\n   HANDLE hFind = FindFirstFile((directory + \"\\\\*\").c_str(),\r\n                                &amp;findFileData);\r\n\r\n   if (hFind == INVALID_HANDLE_VALUE) {\r\n       std::cerr &lt;&lt; \"FindFirstFile failed (\" \r\n                 &lt;&lt; GetLastError() &lt;&lt; \")\\n\";\r\n       return;\r\n   }\r\n\r\n   do {\r\n       if (!(findFileData.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)) {\r\n           WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;\r\n           if (GetFileAttributesEx((directory + \"\\\\\" + findFileData.cFileName).c_str(), GetFileExInfoStandard, &amp;fileAttributeData)) {\r\n               FileInfo fileInfo;\r\n               fileInfo.fileName = findFileData.cFileName;\r\n               fileInfo.lastWriteTime = fileAttributeData.ftLastWriteTime;\r\n               files.push_back(fileInfo);\r\n           }\r\n       }\r\n   } while (FindNextFile(hFind, &amp;findFileData) != 0);\r\n\r\n   FindClose(hFind);\r\n}\r\n<\/code><\/pre>\n<h4 id=\"benchmarkstdfilesystem\">BenchmarkStdFilesystem<\/h4>\n<p>And the last one, the most portable technique:<\/p>\n<pre><code class=\"language-cpp\">void BenchmarkStdFilesystem(const std::string&amp; directory, \r\n                            std::vector&lt;FileInfo&gt;&amp; files) \r\n{\r\n    for (const auto&amp; entry : std::filesystem::directory_iterator(directory)) {\r\n        if (entry.is_regular_file()) {\r\n            FileInfo fileInfo;\r\n            fileInfo.fileName = entry.path().filename().string();\r\n            FILETIME ft{};\r\n            ft.dwLowDateTime = pInfo-&gt;LastWriteTime.LowPart;\r\n            ft.dwHighDateTime = pInfo-&gt;LastWriteTime.HighPart;\r\n            fileInfo.lastWriteTime = ft;\r\n            files.push_back(fileInfo);\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\n<h4 id=\"benchmarkgetfileinformationbyhandleex\">BenchmarkGetFileInformationByHandleEx<\/h4>\n<pre><code class=\"language-cpp\">void BenchmarkGetFileInformationByHandleEx(const std::wstring&amp; directory, std::vector&lt;FileInfo&gt;&amp; files) {\r\n    HANDLE hDir = CreateFileW(\r\n        directory.c_str(),\r\n        GENERIC_READ,\r\n        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\r\n        NULL,\r\n        OPEN_EXISTING,\r\n        FILE_FLAG_BACKUP_SEMANTICS,\r\n        NULL\r\n    );\r\n\r\n    if (hDir == INVALID_HANDLE_VALUE) {\r\n        std::wcerr &lt;&lt; L\"CreateFile failed (\" &lt;&lt; GetLastError() &lt;&lt; L\")\\n\";\r\n        return;\r\n    }\r\n\r\n    constexpr DWORD BufferSize = 64 * 1024;\r\n    uint8_t buffer[BufferSize];\r\n    FILE_FULL_DIR_INFO* pInfo = reinterpret_cast&lt;FILE_FULL_DIR_INFO*&gt;(buffer);\r\n\r\n    while (true) {\r\n        if (!GetFileInformationByHandleEx(\r\n            hDir,\r\n            FileFullDirectoryInfo,\r\n            pInfo,\r\n            sizeof(buffer))) {\r\n            DWORD error = GetLastError();\r\n            if (error == ERROR_NO_MORE_FILES) {\r\n                break;\r\n            }\r\n            else {\r\n                std::wcerr &lt;&lt; L\"GetFileInformationByHandleEx failed (\" &lt;&lt; error &lt;&lt; L\")\\n\";\r\n                break;\r\n            }\r\n        }\r\n\r\n        do {\r\n            if (!(pInfo-&gt;FileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)) {\r\n                FileInfo fileInfo;\r\n                fileInfo.fileName = std::wstring(pInfo-&gt;FileName, pInfo-&gt;FileNameLength \/ sizeof(WCHAR));\r\n                FILETIME ft{};\r\n                ft.dwLowDateTime = pInfo-&gt;LastWriteTime.LowPart;\r\n                ft.dwHighDateTime = pInfo-&gt;LastWriteTime.HighPart;\r\n                fileInfo.lastWriteTime = ft;\r\n                files.push_back(fileInfo);\r\n            }\r\n            pInfo = reinterpret_cast&lt;FILE_FULL_DIR_INFO*&gt;(\r\n                reinterpret_cast&lt;BYTE*&gt;(pInfo) + pInfo-&gt;NextEntryOffset);\r\n        } while (pInfo-&gt;NextEntryOffset != 0);\r\n    }\r\n\r\n    CloseHandle(hDir);\r\n}\r\n<\/code><\/pre>\n<h3 id=\"the-main-function\">The Main Function<\/h3>\n<p>The <code>main<\/code> function sets up the benchmarking environment, runs the benchmarks, and prints the results.<\/p>\n<pre><code class=\"language-cpp\">std::wstring directory = argv[1];\r\nconst auto arg2 = argc &gt; 2 ? std::wstring_view(argv[2]) : std::wstring_view{};\r\n\r\nstd::vector&lt;std::pair&lt;std::wstring, std::function&lt;void(std::vector&lt;FileInfo&gt;&amp;)&gt;&gt;&gt; benchmarks = {\r\n    {L\"FindFirstFileEx (Basic)\", [&amp;](std::vector&lt;FileInfo&gt;&amp; files) {\r\n        BenchmarkFindFirstFileEx(directory, files, FindExInfoBasic, 0);\r\n    }},\r\n    {L\"FindFirstFileEx (Standard)\", [&amp;](std::vector&lt;FileInfo&gt;&amp; files) {\r\n        BenchmarkFindFirstFileEx(directory, files, FindExInfoStandard, 0);\r\n    }},\r\n    {L\"FindFirstFileEx (Large Fetch)\", [&amp;](std::vector&lt;FileInfo&gt;&amp; files) {\tBenchmarkFindFirstFileEx(directory, files, FindExInfoStandard, FIND_FIRST_EX_LARGE_FETCH);\r\n    }},\r\n    {L\"GetFileAttributesEx\", [&amp;](std::vector&lt;FileInfo&gt;&amp; files) {\r\n        BenchmarkGetFileAttributesEx(directory, files);\r\n    }},\r\n    {L\"std::filesystem\", [&amp;](std::vector&lt;FileInfo&gt;&amp; files) {\r\n        BenchmarkStdFilesystem(directory, files);\r\n        }},\r\n    {L\"GetFileInformationByHandleEx\", [&amp;](std::vector&lt;FileInfo&gt;&amp; files) {\r\n        BenchmarkGetFileInformationByHandleEx(directory, files);\r\n    }}\r\n};\r\n\r\nstd::vector&lt;std::pair&lt;std::wstring, double&gt;&gt; results;\r\n\r\nfor (const auto&amp; benchmark : benchmarks) {\r\n    std::vector&lt;FileInfo&gt; files;\r\n    files.reserve(2000); \/\/ Reserve space outside the timing measurement\r\n\r\n    auto start = std::chrono::high_resolution_clock::now();\r\n    benchmark.second(files);\r\n    auto end = std::chrono::high_resolution_clock::now();\r\n\r\n    std::chrono::duration&lt;double&gt; elapsed = end - start;\r\n    results.emplace_back(benchmark.first, elapsed.count());\r\n}\r\n\r\nPrintResultsTable(results);\r\n<\/code><\/pre>\n<h2 id=\"performance-results\">Performance Results<\/h2>\n<p>To measure the performance of each file attribute retrieval method, I executed benchmarks on a directory containing 1000, 2000 or 5000 random text files. The tests were performed on a laptop equipped with an Intel i7 4720HQ CPU and an SSD. I measured the time taken by each method and compared the results to determine the fastest approach.<\/p>\n<p>Each test run consisted of two executions: the first with uncached file attributes and the second likely benefiting from system-level caching.<\/p>\n<p>The speedup factor is the factor of the current result compared to the slowest technique in a given run.<\/p>\n<p>1000 files:<\/p>\n<pre><code class=\"language-text\">Method                         Time (seconds)       Speedup Factor\r\nFindFirstFileEx (Basic)        0.0014831000         162.868\r\nFindFirstFileEx (Standard)     0.0014817000         163.022\r\nFindFirstFileEx (Large Fetch)  0.0011792000         204.842\r\nGetFileAttributesEx            0.2415497000         1.000\r\nstd::filesystem                0.0609313000         3.964\r\nGetFileInformationByHandleEx   0.0044168000         54.689\r\n\r\n\/\/ second run:\r\nMethod                         Time (seconds)       Speedup Factor\r\nFindFirstFileEx (Basic)        0.0013805000         44.947\r\nFindFirstFileEx (Standard)     0.0011310000         54.863\r\nFindFirstFileEx (Large Fetch)  0.0009071000         68.404\r\nGetFileAttributesEx            0.0616772000         1.006\r\nstd::filesystem                0.0620496000         1.000\r\nGetFileInformationByHandleEx   0.0025246000         24.578\r\n<\/code><\/pre>\n<p>Directory with 2000 files:<\/p>\n<pre><code class=\"language-text\">Method                         Time (seconds)       Speedup Factor\r\nFindFirstFileEx (Basic)        0.0014455000         150.287\r\nFindFirstFileEx (Standard)     0.0015029000         144.547\r\nFindFirstFileEx (Large Fetch)  0.0012086000         179.745\r\nGetFileAttributesEx            0.2172402000         1.000\r\nstd::filesystem                0.0609186000         3.566\r\nGetFileInformationByHandleEx   0.0025069000         86.657\r\n\r\nMethod                         Time (seconds)       Speedup Factor\r\nFindFirstFileEx (Basic)        0.0012020000         50.908\r\nFindFirstFileEx (Standard)     0.0011614000         52.688\r\nFindFirstFileEx (Large Fetch)  0.0008887000         68.856\r\nGetFileAttributesEx            0.0611920000         1.000\r\nstd::filesystem                0.0611760000         1.000\r\nGetFileInformationByHandleEx   0.0025835000         23.686\r\n<\/code><\/pre>\n<p>Directory with 5000 random, small text files:<\/p>\n<pre><code class=\"language-text\">Method                         Time (seconds)       Speedup Factor\r\nFindFirstFileEx (Basic)        0.0077623000         84.975\r\nFindFirstFileEx (Standard)     0.0828258000         7.964\r\nFindFirstFileEx (Large Fetch)  0.0144611000         45.612\r\nGetFileAttributesEx            0.6595977000         1.000\r\nstd::filesystem                0.3022779000         2.182\r\nGetFileInformationByHandleEx   0.0051569000         127.906\r\n\r\nMethod                         Time (seconds)       Speedup Factor\r\nFindFirstFileEx (Basic)        0.0069814000         43.844\r\nFindFirstFileEx (Standard)     0.0148472000         20.616\r\nFindFirstFileEx (Large Fetch)  0.0140663000         21.761\r\nGetFileAttributesEx            0.3060932000         1.000\r\nstd::filesystem                0.3011346000         1.016\r\nGetFileInformationByHandleEx   0.0051614000         59.304\r\n<\/code><\/pre>\n<p>The results consistently showed that <code>FindFirstFileEx<\/code> with the <code>Standard<\/code> flag was the fastest method in uncached scenarios, offering speedups up to 129x compared to <code>GetFileAttributesEx<\/code>. However, in cached scenarios, <code>FindFirstFileEx<\/code> (Basic and Standard) achieved over 50x speedup improvements. The parameters for &#8220;Large Fetch&#8221; seems to increase the performance.<\/p>\n<p>For the directory with 2000 files, <code>FindFirstFileEx<\/code> (Basic) demonstrated a speedup factor of over 179x in the first run and went down to 68 in the second run. In the directory with 5000 files, we can see that <code>GetFileInformationByHandleEx<\/code> takes crown and acheives 59x speedup, while other techniques reaches 43x max. Notably, <code>std::filesystem<\/code> performed on par with <code>GetFileAttributesEx<\/code> .<\/p>\n<h2 id=\"further-techniques\">Further Techniques<\/h2>\n<p>Getting file attributes is only part of the story, and while important, they may contribute to only a small portion of the overall performance for the whole project. The Visual Assist team, who contributed to this article, improved their initial parse time performance by avoiding <code>GetFileAttributes[Ex]<\/code> using the same techniques as this article. But Visual Assist also improved performance through further techniques. My simple benchmark showed 50x speedups, but we cannot directly compare it with the final Visual Assist, as the tool does many more things with files.<\/p>\n<p>The main item being optimised was the initial parse, where VA builds a symbol database when a project is opened for the first time. This involves parsing all code and all headers. They decided that it&#8217;s a reasonable assumption that headers won&#8217;t change while a project is being loaded, and so the file access is cached during the initial parse, avoiding the filesystem entirely. (Changes after a project has been parsed the first time are, of course, still caught.) The combination of switching to a much faster method for checking filetimes and then avoiding file IO completely contributed to the up-to-15-times-faster performance improvement they saw in version 2024.1 at the beginning of this year.<\/p>\n<p>Read further details on their blog <a href=\"https:\/\/www.wholetomato.com\/blog\/2024\/01\/31\/visual-assist-2024-1-release-post\/\">Visual Assist 2024.1 release post &#8211; January 2024<\/a> and <a href=\"https:\/\/www.wholetomato.com\/blog\/2024\/07\/21\/catching-up-with-va-our-most-recent-performance-updates\/\">Catching up with VA: Our most recent performance updates &#8211; Tomato Soup<\/a>.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<p>In the text, we went through a benchmark that compares several techniques for fetching file attributes. In short, it&#8217;s best to gather attributes at the same time as you iterate through the directory &#8211; using <code>FindFirstFileEx<\/code> or via <code>GetFileInformationByHandleEx<\/code>. So if you want to do this operation hundreds of times, it&#8217;s best to measure time and choose the best technique. What&#8217;s more, if you expect to have lots of files in a directory it&#8217;s good to check techniques offering larger buffers.<\/p>\n<p>The benchmark also showed one feature: while C++17 and its <code>filesystem<\/code> library offer a robust and standardized way to work with files and directories, it can be limited in terms of performance. In many cases, if you need super optimal performance, you need to open the hood and work with the specific operating system API.<\/p>\n<h4 id=\"back-to-you\">Back to you<\/h4>\n<ul>\n<li>Do you use std::filesystem for tasks involving hundreds of files?<\/li>\n<li>Do you know other techniques that offer greater performance when working with files?<\/li>\n<\/ul>\n<p>Share your comments below. And if you&#8217;re using C++, you can also download and try Visual Assist yourself for 30 days for free.<\/p>\n<p><span data-sheets-root=\"1\"><div class=\"actions\">\r\n\t<a href=\"https:\/\/www.wholetomato.com\/downloads?utm_content=blog-\" class=\"button primary\">Try Visual Assist<\/a>\r\n<\/div><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR If your app scans thousands of files, the way you fetch file attributes can quietly destroy performance. Standard methods like\u00a0GetFileAttributesEx\u00a0or even std::filesystem\u00a0are convenient but painfully slow at scale. By switching to faster Windows APIs&#8230;<\/p>\n","protected":false},"author":183830964,"featured_media":4021,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_newsletter_tier_id":0,"footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[672],"tags":[2426,726359983,1930,726360020,726360021,726360022,12004844],"class_list":["post-4010","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tips-and-tricks","tag-c","tag-file","tag-performance","tag-query","tag-retrieval","tag-speed","tag-visual-assist"],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2024\/11\/15_WT-Query-File-Attributes-50x-faster-blog-header-1200x480-1.png?fit=1200%2C400&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfpLS4-12G","aioseo_head":"\n\t\t<!-- All in One SEO Pro 4.9.7.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"Bartlomiej Filipek\"\/>\n\t<meta name=\"google-site-verification\" content=\"DtHrwoEjg0KG_fbuPSp5j_wNIf-g5hSh4EH6tZBoCIw\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 4.9.7.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Tomato Soup - Visual Assist Team Blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Query File Attributes 50x Faster on Windows \u2013 2026 Update\" \/>\n\t\t<meta property=\"og:description\" content=\"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2024-11-14T15:52:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-05-12T18:03:52+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/wholetomatosoftware\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@visualassist\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Query File Attributes 50x Faster on Windows \u2013 2026 Update\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@visualassist\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#blogposting\",\"name\":\"Query File Attributes 50x Faster on Windows \\u2013 2026 Update\",\"headline\":\"How to Query File Attributes 50x faster on Windows\",\"author\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/bartlomiejfilipek6eba5efda2\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/15_WT-Query-File-Attributes-50x-faster-blog-header-1200x480-1.png?fit=1200%2C400&ssl=1\",\"width\":1200,\"height\":400},\"datePublished\":\"2024-11-14T11:52:55-04:00\",\"dateModified\":\"2026-05-12T14:03:52-04:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#webpage\"},\"articleSection\":\"Tips and Tricks, c++, file, performance, query, retrieval, speed, visual assist, English\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/tips-and-tricks\\\/#listItem\",\"name\":\"Tips and Tricks\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/tips-and-tricks\\\/#listItem\",\"position\":2,\"name\":\"Tips and Tricks\",\"item\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/tips-and-tricks\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#listItem\",\"name\":\"How to Query File Attributes 50x faster on Windows\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#listItem\",\"position\":3,\"name\":\"How to Query File Attributes 50x faster on Windows\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/tips-and-tricks\\\/#listItem\",\"name\":\"Tips and Tricks\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\",\"name\":\"Tomato Soup\",\"description\":\"Visual Assist Team Blog\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/\",\"email\":\"info@wholetomato.com\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":0,\"maxValue\":100},\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/wt-logo.jpg?fit=400%2C400&ssl=1\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#organizationLogo\",\"width\":400,\"height\":400},\"image\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/wholetomatosoftware\",\"https:\\\/\\\/twitter.com\\\/visualassist\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/Wholetomatosoftware\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/whole-tomato-software\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/bartlomiejfilipek6eba5efda2\\\/#author\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/bartlomiejfilipek6eba5efda2\\\/\",\"name\":\"Bartlomiej Filipek\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#webpage\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/\",\"name\":\"Query File Attributes 50x Faster on Windows \\u2013 2026 Update\",\"description\":\"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/bartlomiejfilipek6eba5efda2\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/bartlomiejfilipek6eba5efda2\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/15_WT-Query-File-Attributes-50x-faster-blog-header-1200x480-1.png?fit=1200%2C400&ssl=1\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#mainImage\",\"width\":1200,\"height\":400},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/how-to-query-file-attributes-50x-faster-on-windows\\\/#mainImage\"},\"datePublished\":\"2024-11-14T11:52:55-04:00\",\"dateModified\":\"2026-05-12T14:03:52-04:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/\",\"name\":\"Tomato Soup\",\"description\":\"Visual Assist Team Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>Query File Attributes 50x Faster on Windows \u2013 2026 Update<\/title>\n\n","aioseo_head_json":{"title":"Query File Attributes 50x Faster on Windows \u2013 2026 Update","description":"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.","canonical_url":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"google-site-verification":"DtHrwoEjg0KG_fbuPSp5j_wNIf-g5hSh4EH6tZBoCIw","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#blogposting","name":"Query File Attributes 50x Faster on Windows \u2013 2026 Update","headline":"How to Query File Attributes 50x faster on Windows","author":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/bartlomiejfilipek6eba5efda2\/#author"},"publisher":{"@id":"https:\/\/www.wholetomato.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2024\/11\/15_WT-Query-File-Attributes-50x-faster-blog-header-1200x480-1.png?fit=1200%2C400&ssl=1","width":1200,"height":400},"datePublished":"2024-11-14T11:52:55-04:00","dateModified":"2026-05-12T14:03:52-04:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#webpage"},"isPartOf":{"@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#webpage"},"articleSection":"Tips and Tricks, c++, file, performance, query, retrieval, speed, visual assist, English"},{"@type":"BreadcrumbList","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.wholetomato.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/tips-and-tricks\/#listItem","name":"Tips and Tricks"}},{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/tips-and-tricks\/#listItem","position":2,"name":"Tips and Tricks","item":"https:\/\/www.wholetomato.com\/blog\/category\/tips-and-tricks\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#listItem","name":"How to Query File Attributes 50x faster on Windows"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#listItem","position":3,"name":"How to Query File Attributes 50x faster on Windows","previousItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/tips-and-tricks\/#listItem","name":"Tips and Tricks"}}]},{"@type":"Organization","@id":"https:\/\/www.wholetomato.com\/blog\/#organization","name":"Tomato Soup","description":"Visual Assist Team Blog","url":"https:\/\/www.wholetomato.com\/blog\/","email":"info@wholetomato.com","numberOfEmployees":{"@type":"QuantitativeValue","minValue":0,"maxValue":100},"logo":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2020\/05\/wt-logo.jpg?fit=400%2C400&ssl=1","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#organizationLogo","width":400,"height":400},"image":{"@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/wholetomatosoftware","https:\/\/twitter.com\/visualassist","https:\/\/www.youtube.com\/c\/Wholetomatosoftware","https:\/\/www.linkedin.com\/company\/whole-tomato-software"]},{"@type":"Person","@id":"https:\/\/www.wholetomato.com\/blog\/author\/bartlomiejfilipek6eba5efda2\/#author","url":"https:\/\/www.wholetomato.com\/blog\/author\/bartlomiejfilipek6eba5efda2\/","name":"Bartlomiej Filipek"},{"@type":"WebPage","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#webpage","url":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/","name":"Query File Attributes 50x Faster on Windows \u2013 2026 Update","description":"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.wholetomato.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#breadcrumblist"},"author":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/bartlomiejfilipek6eba5efda2\/#author"},"creator":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/bartlomiejfilipek6eba5efda2\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2024\/11\/15_WT-Query-File-Attributes-50x-faster-blog-header-1200x480-1.png?fit=1200%2C400&ssl=1","@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#mainImage","width":1200,"height":400},"primaryImageOfPage":{"@id":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/#mainImage"},"datePublished":"2024-11-14T11:52:55-04:00","dateModified":"2026-05-12T14:03:52-04:00"},{"@type":"WebSite","@id":"https:\/\/www.wholetomato.com\/blog\/#website","url":"https:\/\/www.wholetomato.com\/blog\/","name":"Tomato Soup","description":"Visual Assist Team Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.wholetomato.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Tomato Soup - Visual Assist Team Blog","og:type":"article","og:title":"Query File Attributes 50x Faster on Windows \u2013 2026 Update","og:description":"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.","og:url":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/","article:published_time":"2024-11-14T15:52:55+00:00","article:modified_time":"2026-05-12T18:03:52+00:00","article:publisher":"https:\/\/www.facebook.com\/wholetomatosoftware","twitter:card":"summary_large_image","twitter:site":"@visualassist","twitter:title":"Query File Attributes 50x Faster on Windows \u2013 2026 Update","twitter:description":"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.","twitter:creator":"@visualassist"},"aioseo_meta_data":{"post_id":"4010","title":"Query File Attributes 50x Faster on Windows \u2013 #current_year Update","description":"Boost Windows file scans with methods up to 50x faster. See benchmarks, code examples, and tips from the experts at Whole Tomato.","keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"open_ai":"{\"title\":{\"suggestions\":[],\"usage\":0},\"description\":{\"suggestions\":[],\"usage\":0}}","ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2024-11-13 21:06:14","updated":"2026-05-12 18:13:53"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.wholetomato.com\/blog\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.wholetomato.com\/blog\/category\/tips-and-tricks\/\" title=\"Tips and Tricks\">Tips and Tricks<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\tHow to Query File Attributes 50x faster on Windows\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.wholetomato.com\/blog"},{"label":"Tips and Tricks","link":"https:\/\/www.wholetomato.com\/blog\/category\/tips-and-tricks\/"},{"label":"How to Query File Attributes 50x faster on Windows","link":"https:\/\/www.wholetomato.com\/blog\/how-to-query-file-attributes-50x-faster-on-windows\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/users\/183830964"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/comments?post=4010"}],"version-history":[{"count":12,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4010\/revisions"}],"predecessor-version":[{"id":4913,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4010\/revisions\/4913"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/media\/4021"}],"wp:attachment":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/media?parent=4010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/categories?post=4010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/tags?post=4010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}