這個範例主要是要提供一個函式SearchFile,透過他可以透過萬用字元的方式來找尋特定目錄下的檔案。
舉例來說,如果你想找出c:\windows下面的所有執行檔。您就可以透過這個函式找出來。
#include <iostream>
#include <sysutils.hpp>
#include <masks.hpp>
#include <memory>using namespace std;
/**
* 測試檔名是否符合指定的萬用字元pattern。
*
* @param pattern 萬用字元。
* @param filename 要測試的檔名。
*
* @retval true 檔名符合。
* @retval false 檔名不符。
*/
bool Glob(AnsiString pattern, AnsiString filename)
{
auto_ptr<TMask> mask ;
try
{
mask.reset(new TMask(pattern));
}
catch (...)
{
return false;
}
return mask->Matches(filename);
}
/**
* 從 beginPath 所指定的目錄開始找尋指定的檔案。
*
* @param beginPath 起始目錄
* @param filePattern 要找尋的檔名樣式。使用與DOS相同的萬用字元格式。
* @param[out] 符合的檔案將會被放在這個目錄中。這裡面的檔名均是絕對路徑。
* @return 傳回找到檔案的數目。如果傳回0表示沒有找到。
*/
int SearchFile(
AnsiString beginPath,
AnsiString filePattern,
TStrings *result)
{
TSearchRec sr;
int attrib = faAnyFile|faDirectory;
if (FindFirst(beginPath, attrib, sr) == 0)
{
do
{
if (sr.Attr | faDirectory)
{
// 如果發現遇到目錄就以遞迴的方式進去找。
beginPath = IncludeTrailingPathDelimiter(beginPath) + sr.Name;
SearchFile(beginPath, filePattern, result);
}
else
{
// 發現一般的檔案,進行檔名比對。
if(Glob(filePattern, sr.Name))
{
// 檔名符合pattern,以絕對路徑的格式記錄下來。
beginPath = IncludeTrailingPathDelimiter(beginPath) + sr.Name;
result->Add(beginPath);
}
}
} while (FindNext(sr) == 0);
FindClose(sr);
}
return result->Count;
}
int main(void)
{
auto_ptr<TStringList> sr (new TStringList());
// 找出c:windows下面所有副檔名為.exe的檔案。
SearchFile("c:windows\", "*.exe", sr.get());
for(int i = 0 ; i < sr->Count; ++i)
{
cout < < sr->Strings[i] < < endl;
}
}
留言列表