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負責將中...