線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2006
推到 Plurk!
推到 Facebook!

如何獲得整隻目錄的總容量

答題得分者是:RaynorPao
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-05 23:16:20 IP:61.30.xxx.xxx 未訂閱
請教各位大大: 如目錄為 C:\Win 想獲得此目錄下所有檔案的容量 (包含Win下所有的子目錄), 小弟只知道用WIN32_FIND_DATA結構 FindFirstFile , FindNextFile 可是回圈繞一繞值都不太正確,求助各位先進們.
------
--==多看.多學.多聽==--
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-06 21:58:29 IP:61.221.xxx.xxx 未訂閱
引言: 請教各位大大: 如目錄為 C:\Win 想獲得此目錄下所有檔案的容量 (包含Win下所有的子目錄), 小弟只知道用WIN32_FIND_DATA結構 FindFirstFile , FindNextFile 可是回圈繞一繞值都不太正確,求助各位先進們.
你說的「不正確」 是指什麼「不正確」?? 檔案的實際 size 和檔案需要的儲存空間 是不同的喔~~
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-07 00:00:33 IP:61.30.xxx.xxx 未訂閱
檔案總管指著該目錄,按滑鼠右鍵的內容,有個該目錄的總容量 目錄少層的話都正確(總容量位元組),太多層就少了一些位元組 我的變數設到9層,我知道掃描目錄回圈一定有誤! 我是用 F=F f.nFileSizeLow; 去累加的,出來應是位元組 請教有寫過類似的大大指導一下,感謝喲! 乎搭啦!
------
--==多看.多學.多聽==--
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-10-07 13:59:23 IP:203.73.xxx.xxx 未訂閱
引言: 檔案總管指著該目錄,按滑鼠右鍵的內容,有個該目錄的總容量 目錄少層的話都正確(總容量位元組),太多層就少了一些位元組 我的變數設到9層,我知道掃描目錄回圈一定有誤! 我是用 F=F f.nFileSizeLow; 去累加的,出來應是位元組 請教有寫過類似的大大指導一下,感謝喲!
我做了一個小小的實驗(希望對你有幫助) 建立一個目錄 C:\Temp 在這個目錄下放了幾十個檔案 副檔名都是 .txt 然後寫了以下程式碼 最後算出來的 size 是正確的
#include "windows.h"
#include "stdio.h"    void main(void)
{
   HRESULT hr=S_FALSE;
   const char* szPath="c:\\temp\\*.txt";
   WIN32_FIND_DATA wfd;
   HANDLE hFile=INVALID_HANDLE_VALUE;
   DWORD dwTotal=0;       ZeroMemory(&wfd, sizeof(WIN32_FIND_DATA));
   hFile=FindFirstFile(szPath, &wfd);
   if(hFile==INVALID_HANDLE_VALUE)
   {
      hr=GetLastError();
      printf("\nFindFirstFile failed, error code=lX", hr);
   }
   else
   {
      dwTotal =wfd.nFileSizeLow;
      printf("\nFindFirstFile, cFileName=%s", wfd.cFileName);
      printf("\nFindFirstFile, nFileSizeLow=%d", wfd.nFileSizeLow);
   }
   while(hFile!=INVALID_HANDLE_VALUE && FindNextFile(hFile, &wfd))
   {
      dwTotal =wfd.nFileSizeLow;
      printf("\nFindNextFile, cFileName=%s", wfd.cFileName);
      printf("\nFindNextFile, nFileSizeLow=%d", wfd.nFileSizeLow);
   }
   printf("\ndwTotal=%ld", dwTotal);
   FindClose(hFile);
}  // end of main
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-10-07 19:38:00 IP:61.30.xxx.xxx 未訂閱
太感謝RaynorPao大大的分享 const char*szPath="c:\\temp\\*.*";    不過此範例只有累加該層目錄的容量 底下的目錄並沒有累加 temp--* | a-*-b--* | | *---C--*-d--*---* | | | | e f  g h ........ 像這樣或更多層目錄全部檔案容量 一層的累加是小回圈,再累加下層的就需要 多幾個回圈,暈頭轉向了
------
--==多看.多學.多聽==--
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-08 08:22:59 IP:203.73.xxx.xxx 未訂閱
引言: 太感謝RaynorPao大大的分享 const char*szPath="c:\\temp\\*.*"; 不過此範例只有累加該層目錄的容量 底下的目錄並沒有累加 temp--* | a-*-b--* | | *---C--*-d--*---* | | | | e f g h ........ 像這樣或更多層目錄全部檔案容量 一層的累加是小回圈,再累加下層的就需要 多幾個回圈,暈頭轉向了 < face="Verdana, Arial, Helvetica"> 你可以嘗試用「迴圈」 或「遞迴」寫寫看 只需要把程式碼改一改就可以 達到你要的目的了
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-10-08 17:01:52 IP:61.30.xxx.xxx 未訂閱
問題的徵結就是在多個回圈內的正確繞法,及結束遞迴的時機 小弟用了兩層回圈,目錄的層在三層內,所得的位元組都正確 再四層以上就不一定正確了,要看累計的是啥目錄的總容量了 所以小弟寫的回圈是正確的,但非絕對正確--唉! Bug嗎? 非常感謝RaynorPao的指導!
------
--==多看.多學.多聽==--
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-10-10 12:16:30 IP:61.30.xxx.xxx 未訂閱
回圈已修改正確,不管幾層目錄幾個檔數值都正確了 沒錯用遞回跑回圈就可以,不過搜完整個45G的目錄可能還是要5~6秒以上 才能得結果 再次感謝RaynorPao大大的提醒
------
--==多看.多學.多聽==--
系統時間:2024-04-24 21:54:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!