11

C++Builder 2007 を使用すると、FindFirstFile および FindNextFile 関数は、Vista および XP の 64 ビット バージョンで一部のファイルを検索できないようです。私のテスト アプリケーションは 32 ビットです。

それらを使用してフォルダー C:\Windows\System32\Drivers を反復処理すると、コマンド プロンプトで dir コマンドを発行すると 185 個のファイルが見つかりますが、少数のファイルしか見つかりません。同じコード例を使用すると、32 ビット バージョンの XP で問題なくすべてのファイルが一覧表示されます。

ここに小さなプログラム例があります:

int main(int argc, char* argv[])
{
  HANDLE hFind;
  WIN32_FIND_DATA FindData;
  int ErrorCode;
  bool cont = true;

  cout << "FindFirst/Next demo." << endl << endl;

  hFind = FindFirstFile("*.*", &FindData);
  if(hFind == INVALID_HANDLE_VALUE)
  {
    ErrorCode = GetLastError();
    if (ErrorCode == ERROR_FILE_NOT_FOUND)
    {
      cout << "There are no files matching that path/mask\n" << endl;
    }
    else
    {
      cout << "FindFirstFile() returned error code " << ErrorCode << endl;
    }
    cont = false;
  }
  else
  {
    cout << FindData.cFileName << endl;
  }

  if (cont)
  {
    while (FindNextFile(hFind, &FindData))
    {
      cout << FindData.cFileName << endl;
    }

    ErrorCode = GetLastError();
    if (ErrorCode == ERROR_NO_MORE_FILES)
    {
      cout << endl << "All files logged." << endl;
    }
    else
    {
      cout << "FindNextFile() returned error code " << ErrorCode << endl;
    }

    if (!FindClose(hFind))
    {
      ErrorCode = GetLastError();
      cout << "FindClose() returned error code " << ErrorCode << endl;
    }
  }
  return 0;
}

64 ビット XP の C:\Windows\System32\Drivers フォルダーで実行すると、次のように返されます。

C:\WINDOWS\system32\drivers>t:\Project1.exe
FindFirst/Next demo.

.
..
AsIO.sys
ASUSHWIO.SYS
hfile.txt
raspti.zip
stcp2v30.sys
truecrypt.sys

All files logged.

同じシステムで dir コマンドを実行すると、次のように返されます。

C:\WINDOWS\system32\drivers>dir/p
 Volume in drive C has no label.
 Volume Serial Number is E8E1-0F1E

 Directory of C:\WINDOWS\system32\drivers

16-09-2008  23:12    <DIR>          .
16-09-2008  23:12    <DIR>          ..
17-02-2007  00:02            80.384 1394bus.sys
16-09-2008  23:12             9.453 a.txt
17-02-2007  00:02           322.560 acpi.sys
29-03-2006  14:00            18.432 acpiec.sys
24-03-2005  17:11           188.928 aec.sys
21-06-2008  15:07           291.840 afd.sys
29-03-2006  14:00            51.712 amdk8.sys
17-02-2007  00:03           111.104 arp1394.sys
08-05-2006  20:19             8.192 ASACPI.sys
29-03-2006  14:00            25.088 asyncmac.sys
17-02-2007  00:03           150.016 atapi.sys
17-02-2007  00:03           106.496 atmarpc.sys
29-03-2006  14:00            57.344 atmepvc.sys
17-02-2007  00:03            91.648 atmlane.sys
17-02-2007  00:03           569.856 atmuni.sys
24-03-2005  19:12             5.632 audstub.sys
29-03-2006  14:00             6.144 beep.sys
Press any key to continue . . .
etc.

私は困惑しています。これの理由は何ですか?

ブライアン

4

6 に答える 6

9

リダイレクトは行われていますか?Wow64DisableWow64FsRedirection に関するコメントを 参照してください http://msdn.microsoft.com/en-gb/library/aa365743.aspx

于 2008-09-18T19:28:05.250 に答える
2

MSDNでこれを見つけました:

ディレクトリ内のすべてのファイルを一覧表示する 32 ビット アプリケーションを作成していて、アプリケーションが 64 ビット コンピューターで実行される可能性がある場合は、FindFirstFile を呼び出す前に Wow64DisableWow64FsRedirection 関数を呼び出し、FindNextFile の最後の呼び出しの後に Wow64RevertWow64FsRedirection を呼び出す必要があります。詳細については、「ファイル システム リダイレクター」を参照してください。

リンクはこちら

このため、コードを更新する必要があります:-)

于 2008-09-18T19:42:22.610 に答える
1

とった:

http://msdn.microsoft.com/en-gb/library/aa384187(VS.85).aspx

32ビットアプリケーションが64ビットOSでこれらのフォルダーの1つから読み取る場合:

%windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool 

Windowsは、実際には次のコンテンツを一覧表示します。

%windir%\SysWOW64\catroot
%windir%\SysWOW64\catroot2
%windir%\SysWOW64\drivers\etc
%windir%\SysWOW64\logfiles
%windir%\SysWOW64\spool 

あなたの入力クリスに感謝します、それは私が何が起こっているのかを知るのを助けました。

編集:Ludvigにも感謝します:-)

于 2008-09-18T19:44:30.033 に答える
0

コンパイル時に警告はありますか?

この特定のテストに対してすべての警告をオンにしましたか (機能していないため) ?

最初に警告を解決してください。

于 2008-09-18T19:38:45.397 に答える
0

dir コマンドと同じディレクトリを探していますか? 共通のファイルはないようです。

また、これは問題ではありませんが、「すべてのファイル」の正しいワイルド カードは * です。

*.* は、「名前に . が少なくとも 1 つ含まれるすべてのファイル」を意味します。

于 2008-09-18T19:25:53.027 に答える
0

サンプルコードに問題はありません。Delphi で書かれた別のアプリケーションも失敗します。リダイレクトに関するクリスの回答に基づいて回答を見つけたと思います: http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

于 2008-09-18T19:40:55.127 に答える