首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

利用 Scripting.FileSystemObject 极速取得目錄大小

     編輯:關於C++

前言:避免遞迴遍歷的效能陷阱

傳統遞迴 FindFirstFile/FindNextFile 計算目錄大小,在深層、大量檔案目錄下極其緩慢。Windows **Scripting Runtime (scrrun.dll)** 提供的 FileSystemObject 內建 Folder.Size 屬性,由 Shell 快取直接回傳,**速度快數個數量級**。本文示範 C++Builder 透過 COM 呼叫的極簡實作。

核心程式碼 (C++Builder)

#include  // Variant, COM 支援

void __fastcall GetFolderSizeFast()
{
    Variant fs = Variant::CreateObject("Scripting.FileSystemObject");
    Variant folder = fs.OleFunction("GetFolder", "D:\\Winnt"); // 目標路徑
    Variant size = folder.OlePropertyGet("Size"); // 取得 Size 屬性 (bytes)

    ShowMessage("目錄大小: " + size + " bytes");
    // 約 1.2 GB → 顯示 1288490188
}

關鍵點解析

  • Variant::CreateObject:建立 COM 物件 (Scripting.FileSystemObject 需系統已註冊 scrrun.dll,Windows 內建)
  • OleFunction("GetFolder", path):呼叫方法取得 Folder 物件
  • OlePropertyGet("Size"):讀取屬性,回傳 64-bit 整數 (Variant 型別自動轉換)
  • **原理**:Shell 命名空間擴充會在背景維護目錄大小快取,查詢近乎瞬間完成

適用場景與限制

優點缺點/限制
極快 (毫秒級)需 COM 初始化 (CoInitialize),VCL 應用程式通常已自動處理
程式碼極簡依賴 Shell 快取準確性 (極少數情況下可能未更新)
支援網路路徑 (UNC)無法取得單一檔案大小 (需 File.Size)
自動處理 64-bit 大小無法排除特定副檔名/隱藏檔 (為整個目錄樹總和)

進階:同步確保快取最新

若需強制重新計算,可先呼叫 folder.OleProcedure("Refresh"),但會退化回遞迴掃描速度。

替代方案:Windows 10+ Storage API

現代應用可使用 StorageFolder.GetBasicPropertiesAsync() (UWP/WinRT) 或 GetCompressedFileSizeTransacted 等原生 API,不依賴 COM/Scripting Runtime。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved