2017-02-24 7 views
0

これは私を狂っています。私はドライブ上のすべてのファイルのサイズを見て、ディレクトリツリーを歩く簡単なプログラムを書いています。かなり甘いもの。FindFirstFileディレクトリをスキップする

しかし、私は期待した答えが得られていないことに気付きました。私のコードはで、いくつかのディレクトリをスキップしています。開始するには、ここに私のコードの(簡体字)版だ:私は取得しています

#include <stdio.h> 
#include <Windows.h> 

int main() 
{ 
    WIN32_FIND_DATA fd; 
    HANDLE h = FindFirstFile(L"c:\\Windows\\System32\\wbem\\*.*", &fd); 

    if (h != INVALID_HANDLE_VALUE) 
    { 
    BOOL b; 
    do { 
     if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
      printf("d: %S\n", fd.cFileName); 
     //else 
     // printf("f: %S\n", fd.cFileName); 

     b = FindNextFile(h, &fd); 
    } while (b != FALSE); 
    FindClose(h); 
    } 
} 

出力は、あなたが期待するものはかなりある。しかし

d: . 
d: .. 
d: AutoRecover 
d: en-US 
d: Logs 
d: Repository 
d: tmf 
d: xml 

、C言語でコマンドプロンプトから:\ WINDOWS \ SYSTEM32 \ WBEM、dir /adは私を与える:

06/15/2016 07:20 PM <DIR>   . 
06/15/2016 07:20 PM <DIR>   .. 
04/14/2016 05:40 PM <DIR>   AutoRecover 
03/24/2011 03:52 PM <DIR>   en-US 
07/13/2009 06:34 PM <DIR>   Logs 
07/13/2009 09:08 PM <DIR>   MOF 
02/20/2017 10:32 PM <DIR>   Performance 
02/23/2017 03:59 AM <DIR>   Repository 
07/13/2009 06:36 PM <DIR>   tmf 
07/13/2009 07:20 PM <DIR>   xml 
       0 File(s)    0 bytes 
       10 Dir(s) 171,203,104,768 bytes free 

精密検査はPerformanceMOFディレクトリが私の出力にリストされていないことが明らかになりました。ハァッ?

これらのディレクトリについては明らかに違いがあります。しかし何?

  • dirの出力を見ると、それらは接合部ではないことがわかります。
  • attribを使用すると、特別なフラグは設定されません(システムや隠しなど)。
  • fsutilはハードリンクを表示していません。
  • ディレクトリのアクセス権を見ると、管理者(私は)が完全に制御できます。

私は困惑しています。私は今までを実行して、私のディレクトリテーブルが台無しになっているかどうか確認しています。 Cleaning up 472 unused index entries from index $SII of file 0x9. Cleaning up 472 unused index entries from index $SDH of file 0x9.以外は何も見つかりませんでした。

さまざまなオプションでFindFileExを使用しようとしましたが、これらのディレクトリを表示できません。

私は他に何を試みるか考えることはできません。これらのディレクトリはdirに表示されますが、FindFileでは表示されません。そして、(もっと重要なことに)FindFileにそれらを表示させるにはどうすればいいですか?

FWIW:

  • のWindows 7のx64
  • ドライブCは、あなたのコードは、64ビットSystem32フォルダにアクセスしようとしているNTFS
  • MSVC 2010で構築

答えて

3

です。

あなたのコードは32ビットとしてコンパイルされていると推測しています。実際には、フォルダにはFile System Redirectorのために実際にアクセスします。私のWin7 x64マシンでは、見つからないフォルダ(MOFPerformance)は、64ビットSystem32\wbemフォルダにのみ存在し、32ビットのSysWOW64\wbemフォルダには存在しません。

32ビットコードを64ビットSystem32フォルダにアクセスしたい場合、それは例えば、リダイレクトを避けるために、WOW64の特別Sysnativeエイリアスを使用することがあります。

HANDLE h = FindFirstFile(L"c:\\Windows\\Sysnative\\wbem\\*.*", &fd); 

使用IsWow64Process()あなたのコードが内部に動作しているかどうかを知りますWOW64エミュレータのバージョンを確認してください。

これで、c:\\Windowsパスをハードコードしないでください。すべてのユーザーがWindowsをそのパスにインストールするわけではありません。代わりにGetWindowsDirectory(),SHGetFolderPath(CSIDL_WINDOWS)、またはSHGetKnownFolderPath(FOLDERID_Windows)を使用して、実際のパスを取得してください。

bool IsRunningInWow64() 
{ 
    #ifndef _WIN64 
    BOOL bIsWow64 = FALSE; 
    if (IsWow64Process(GetCurrentProcess(), &bIsWow64) && bIsWow64) 
     return true; 
    #endif 

    return false; 
} 

... 

WCHAR szMask[MAX_PATH]; 

if (IsRunningInWow64()) 
{ 
    // Must be a 32-bit process running on a 64-bit system. 
    // Use the 'Sysnative' alias... 

    GetWindowsDirectory(szMask, MAX_PATH); 
    // or: SHGetFolderPath(..., CSIDL_WINDOWS, ...); 
    // or: SHGetKnownFolderPath(FOLDERID_Windows, ...); 
    PathAppend(szMask, L"Sysnative"); 
} 
else 
{ 
    // Must be either: 
    // - A 32-bit process running on a 32-bit system. 
    // - A 64-bit process running on a 64-bit system. 
    // Use the standard 'System32' path... 

    GetSystemDirectory(szMask, MAX_PATH); 
    // or: SHGetFolderPath(..., CSIDL_SYSTEM, ...); 
    // or: SHGetKnownFolderPath(FOLDERID_System, ...); 
} 

PathAppend(szMask, L"wbem"); 
PathAppend(szMask, L"*.*"); 

HANDLE h = FindFirstFile(szMask, &fd); 
+0

いやはや:

は、より多くのこのような何かを試してみてください!うん、確かに、私は32ビットを構築していた。報告されたディレクトリはsyswow64からのものでした。そこにあるwbemディレクトリには、これらの2つのディレクトリが含まれていません。 –

関連する問題