0

条件付きのサブディレクトリでの検索について尋ねました。最初の答えは、FindFirstFileEx() を使用することでした。関数がこの目的には適していないか、使い方が間違っているようです。

それで、誰かがフォルダー内で検索する方法を説明できますか、それはすべて、一致するファイルのサブフォルダーです(いくつかのサンプル基準を与えるために).doc; .txt;*.wri; 2009-01-01 よりも新しいですか?

使用方法がわかるように、これらの基準の具体的なコード例を教えてください。

それが不可能な場合、このまったくあいまいなタスクを実行するための代替手段はありますか??? これまでのところ、これを行うためのよく知られた/明白なツール/方法がないことに、私はかなり困惑しています。

4

4 に答える 4

3

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を呼び出すことができることがわかります。ここで、argv 1は検索する文字列(LPCSTR)パターンであり、&FindFileDataは、見つかったデータのファイル情報を含むデータ構造です。hFindは、以降の呼び出しで使用するハンドルです。 FindNextFile .. FindFirstFileExの4番目と6番目のパラメーターを使用して、さらに検索パラメーターを追加することもできると思います。

幸運を!

編集:ところで、 GetFileAttributes()を使用してファイルまたはディレクトリの属性を確認できると思います..FileFindDataにあるファイル名を渡すだけです..(ファイル名はファイルの名前またはディレクトリ名を参照できます)

編集:MrVimes、これがあなたができることです(擬似コードで)

最初のファイルを検索します(*と一致)

  • 「。」、「..」の場合は、ファイル検索データを確認してください(これらは実際にはディレクトリまたはファイルではありません)
    • チェックに合格した場合、ファイル検索データに目的の属性があるかどうかをチェックし(つまり、ファイル名、ファイル属性をチェックし、ファイル作成時間もファイル検索データでチェックできます)、それを使って何でもします
      • チェックに合格した場合は、ファイルに対して必要なことをすべて実行します
    • チェックに失敗した場合は、findnextfileを呼び出すか、終了します。

そんな感じ..

于 2009-02-05T02:04:04.633 に答える
0

これを使用して、*。doc、*。txt、および* .wriを検索するための名前としてこれらの値を渡すことにより、これらの値を検索できます。

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);
}
}
于 2009-02-05T02:17:47.087 に答える
0

2つの検索を行う必要があります。1つ目は、サブディレクトリを見つけることです。これは、ファイル仕様なしで行います。ファイルの2回目の検索では、ファイル仕様が使用されます。

于 2009-02-05T02:23:43.440 に答える
0

すべてのFindFirstFileファイルを検索し、値が検索条件に一致しないファイルを無視していると思います。WIN32_FIND_DATA

于 2009-02-05T01:50:17.923 に答える