特定の検索条件を指定した FindFirstFIleEx() の使用例
-
21-08-2019 - |
質問
条件を指定してサブディレクトリを検索することについて質問しました。最初の答えは FindFirstFileEx() を使用することでした。この関数はこの目的には適していないか、私の使い方が間違っているようです。
それで、誰かがフォルダー内で一致するファイルのサブフォルダーをすべて検索する方法を説明してもらえますか(いくつかのサンプル基準を与えるために) .doc;.txt;*.wri;2009 年 1 月 1 日より新しいですか?
使用方法がわかるように、これらの基準に対する具体的なコード例を教えてください。
それが不可能な場合、このまったく曖昧ではないタスクを実行するための代替手段はありますか?これを行うためのよく知られた/明白なツール/方法がこれまでのところないことに、私は非常に困惑しています。
解決
から MSDN:
そのページのコード部分を参照すると、次のようになります。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
void _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
return;
}
_tprintf (TEXT("Target file is %s\n"), argv[1]);
hFind = FindFirstFileEx(argv[1], FindExInfoStandard, &FindFileData,
FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("FindFirstFileEx failed (%d)\n", GetLastError());
return;
}
else
{
_tprintf (TEXT("The first file found is %s\n"),
FindFileData.cFileName);
FindClose(hFind);
}
}
FindFirstFileEx を呼び出すことができることがわかります。ここで、argv1 は検索する文字列 (LPCSTR) パターン、&FindFileData は見つかったデータのファイル情報を含むデータ構造です。hFind は、FindNextFile による後続の呼び出しで使用するハンドルです。FindFirstFileEx の 4 番目と 6 番目のパラメータを使用して、さらに検索パラメータを追加することもできると思います。
幸運を!
編集:ところで、次を使用してファイルまたはディレクトリの属性を確認できると思います GetFileAttributes() ..FileFindData で見つかったファイル名を渡すだけです。(ファイル名はファイル名またはディレクトリ名を指すと思います)
編集:MrVimes、あなたができることは次のとおりです(疑似コードで)
最初のファイルを検索します (* と一致)
- ファイルの検索データが「.」、「..」であるかどうかを確認します (これらは実際にはディレクトリまたはファイルではありません)。
- チェックに合格した場合は、ファイルをチェックして、探している属性があるかどうかデータを検索します (つまり、ファイル名、ファイル属性を確認します。 ファイル検索データでファイルの作成時間も確認できます, 、そしてそれ以外)そしてそれを使って何でもしてください
- チェックに合格した場合は、ファイルに対して必要な操作をすべて行います
- チェックが失敗した場合は、findnextfile を呼び出すか終了します。
- チェックに合格した場合は、ファイルをチェックして、探している属性があるかどうかデータを検索します (つまり、ファイル名、ファイル属性を確認します。 ファイル検索データでファイルの作成時間も確認できます, 、そしてそれ以外)そしてそれを使って何でもしてください
そんな感じ..
他のヒント
私はあなたのすべてのファイルを検索し、そのFindFirstFile
値は、検索条件に一致しないものを無視するWIN32_FIND_DATA
を使用だと思います。
さて、あなたはを検索するための名前としてこれらの値を渡すことによって、* .TXTと* .WRI、* .DOCを検索するためにそれを使用することができます:
FindFirstFileEx("*.doc", FindExInfoStandard, &fileData, FindExSearchNameMatch, NULL, 0);
日付で検索するにはもう少し複雑ですが、ない過度のでます:
SYSTEMTIME createTime;
SYSTEMTIME searchDate;
FILETIME compareTime;
HANDLE searchHandle;
searchDate.wYear = 2009;
searchDate.wMonth= 1;
searchDate.wDay = 1;
SystemTimeToFileTime(searchDate, &compareTime);
searchHandle FindFirstFileEx("*", FindExInfoStandard, &fileData, FindExSearchNameMatch, NULL, 0);
if(searchHandle != INVALID_HANDLE_VALUE)
{
While(searchHandle != ERROR_NO_MORE_FILES)
{
FileTimeToSystemTime(fileData.ftCreationTime, &createTime);
if((ULARGE_INTEGER)compareTime < (ULARGE_INTEGER)createTime)
printf("%s matches date criteria", fileData.cFileName);
FindNextFile(searchHandle, &fileData);
}
}
次の2件の検索を行う必要があります。最初はただサブディレクトリを見つけることです、あなたは任意のファイル仕様なしでそれを行います。ファイルのための第二の検索は、ファイル仕様を使用します。