MFC 利用Win32 API遍歷檔案系統

2021-07-03 17:18:38 字數 3912 閱讀 1139

1. 遍歷檔案系統所需的工具:

1) mfc的cfile並沒有對遍歷檔案系統的功能進行物件導向包裝,因此遍歷檔案系統必須使用較為原始、底層的win32 api;

2) 大致步驟是:

i. 使用::setcurrentdirectory函式設定當前處於什麼目錄下(windows中叫做資料夾);

ii. 使用::findfirstfile獲取當前資料夾下的第乙個檔案的「查詢控制代碼」,注意!不是該檔案的檔案控制代碼,而是一種查詢控制代碼,win32使用了一種「查詢結構」來支援檔案的遍歷;

iii. 接著反覆呼叫::findnextfile獲取下乙個檔案的「查詢控制代碼」,其中可以判斷該檔案是否為資料夾,如果是資料夾的話還可以遞迴地進入該資料夾進行遍歷;

3) 在使用find函式的時候會將查詢的檔案的相關資訊填寫到乙個叫做「查詢結構」的結構體中,然後可以利用該結構體中該檔案的資訊進行一些操作,該結構就是win32_find_data結構體:

struct win32_find_data ;
!要判斷查詢的檔案是檔案還是資料夾只需要看一下dwfileattributes的位掩碼file_attribute_directory是否為1就行了

4) findfirstfile:

i. handle ::findfirstfile(lpctstr lpfilename, lpwin32_find_data lpfindfiledata);

ii. 第乙個引數是目標檔名,可以使用萬用字元,一般在遍歷的時候查詢的第乙個檔案都用_t("*.*")來表示;

iii. 第二個引數就是上面所說的win32_find_data結構的指標,查詢到的檔案的相關資訊就儲存在該結構體中;

iv. 返回值就是相關的「查詢控制代碼」,而不是檔案控制代碼hfile,也不是win32_find_data的控制代碼,而是win32 api內部維護的乙個查詢體的控制代碼,如果失敗則返回invalid_handle_value;

5) findnextfile:

i. bool ::findnextfile(handle hfindfile, lpwin32_find_data lpfinddata);

ii. 第乙個引數就是上一次查詢得到的查詢控制代碼,通常在呼叫findfirstfile之後將返回值傳給該引數進行迭代查詢,查詢的檔案的資訊同樣放在lpfinddata中;

iii. 呼叫成功返回true,否則返回false;

6) setcurrentdirectory:

i. bool ::setcurrentdirectory(lpctstr lppathname);

ii. 將當前所在目錄設成lppathname所指定的目錄,可以是絕對路徑也可以是相對路徑;

iii. 有時可能提供的路徑有問題,因此呼叫失敗返回false,成功則為true;

7) getcurrentdirectory:獲取當前路徑

i. bool ::getcurrentdirectory(dword nbufferlength, lpstr lpbuffer);

ii. 第乙個引數是緩衝區能接受的字元個數,注意!是字元個數而不是位元組數,這最主要是相容unicode;

iii. lpbuffer就是緩衝區;

iv. 為了相容unicode最好這樣呼叫:::getcurrentdirectory(sizeof(szpath) / sizeof(tchar), szpath);

2. 示例——遞迴遍歷乙個資料夾:

void trace_t(int ncount) // 在一行的開頭打ncount個製表符以示資料夾的層級

}void enumeratefile(int nlevel) // 遞迴遍歷檔案系統

}else

} while (::findnextfile(hfind, &fd)); // 繼續查詢,注意findnextfile返回值是bool

::findclose(hfind); }}

void cmainwindow::onlbuttondown(uint nflags, cpoint point)

結果如下:

[d]mfc

[d]code

[f].hello.h.swp

[f]hello.cpp

[f]hello.h

[d]p1

[d]hello

[d]debug

[f]hello.exe

[f]hello.ilk

[f]hello.obj

[f]hello.pch

[f]hello.pdb

[f]vc60.idb

[f]vc60.pdb

[f]hello.cpp

[f]hello.dsp

[f]hello.dsw

[f]hello.h

[f]hello.ncb

[f]hello.opt

[f]hello.plg

[d]shapes

[f]childview.cpp

[f]childview.h

[d]debug

[f]mainfrm.cpp

[f]mainfrm.h

[f]readme.txt

[d]res

[f]shapes.ico

[f]shapes.rc2

[f]resource.h

[f]shapes.aps

[f]shapes.clw

[f]shapes.cpp

[f]shapes.dsp

[f]shapes.dsw

[f]shapes.h

[f]shapes.ncb

[f]shapes.opt

[f]shapes.rc

[f]stdafx.cpp

[f]stdafx.h

[d]test

[d]debug

[f]test.exe

[f]test.ilk

[f]test.obj

[f]test.pch

[f]test.pdb

[f]vc60.idb

[f]vc60.pdb

[f]test.cpp

[f]test.dsp

[f]test.dsw

[f]test.h

[f]test.ncb

[f]test.opt

[f]test.plg

[d]tictac

[d]debug

[f]tictac.exe

[f]tictac.ilk

[f]tictac.obj

[f]tictac.pch

[f]tictac.pdb

[f]vc60.idb

[f]vc60.pdb

[f]tictac.cpp

[f]tictac.dsp

[f]tictac.dsw

[f]tictac.h

[f]tictac.ncb

[f]tictac.opt

[f]tictac.plg

[d]p3

[d]tictac

[d]debug

[f]tictac.exe

[f]tictac.ilk

[f]tictac.obj

[f]tictac.pch

[f]tictac.pdb

[f]vc60.idb

[f]vc60.pdb

[f]tictac.cpp

[f]tictac.dsp

[f]tictac.dsw

[f]tictac.h

[f]tictac.ncb

[f]tictac.opt

[f]tictac.plg

[d]tt

[d]debug

可以清楚的看到層級關係!

系統理解Win32 API和MFC

溫昱 作者主頁 lcspace.diy.163.win32 api是微軟的作業系統windows提供給開發人員的程式設計介面,它決定了我們開發的windows應用程式的能力。mfc是微軟為開發人員提供的類庫,在某種意義上是對win32 api的封裝。本文試圖從全域性角度對win32 api和mfc進...

掃雷程式 win32API

1 已實現功能 基本的掃雷方塊的展開,方塊周圍雷數的計算,方塊的標旗,勝負的判斷,難度的更改 2 未實現功能 控制台顯示剩餘標旗數量和當前所用時間,選單項的豐富 3 基本原理 使用一張二維int表儲存每個方格的數字資訊,其中9表示雷 將整個雷區 客戶區 按難度分割成方格,每個方格為乙個靜態控制項,用...

系統理解Win32 API和MFC 上

系統理解win32 api和mfc 上 作者主頁 lcspace.diy.163.com win32 api的object有3種 user obj,gdi obj,kernel obj。但是,如果一點不考慮os本身的支援,就會在有些問題上疑惑,因此,我這裡把 operation system負責將中...