2017-02-02 10 views
1

特定のファイルが指定された場所に存在するかどうかを確認します。私はそのために複数の解決策を試してきましたが、どれも正しく動作していないようです。WINAPI:ファイル存在チェックに失敗しました

ファイルが指定された場所に存在することは間違いありません。

実行可能ファイルが管理者として実行されているため、適切な権限を持っています。私が使用し

コード:

#include <io.h> 
#include <string> 
#include <Shlwapi.h> 

std::string str = "C:\WINDOWS\System32\iluminated.dll"; 
unsigned long attrib = GetFileAttributes(str.c_str()); 

bool exists1 = (attrib != INVALID_FILE_ATTRIBUTES && 
      !(attrib & FILE_ATTRIBUTE_DIRECTORY)) && 
      GetLastError() != ERROR_FILE_NOT_FOUND; // false 
bool exists2 = (_access(str.c_str(), 0) != -1); // false 
bool exists3 = PathFileExists(str.c_str()) != 0; // false 

を私が間違ってやっているものはありますか?あなたは、文字列内の単一のバックスラッシュを使用する場合は、コマンド記号として解釈されているので

+1

あなたは、少なくともコンパイラの警告を取得できませんでしたか? '警告C4129: 'W':認識できない文字エスケープシーケンス'? –

+0

@MichaelWalzでした。しかし二重スラッシュは警告を消した。 –

+0

警告は実際には多くの場合エラーです。 –

答えて

1

回答が見つかりました。 Windowsは、64ビットWindowsにアクセスしようとしているときに、system32を常にsyswow64にリダイレクトしています。 SysNativeディレクトリを使用しなければなりませんでした.Windowsは適切なsystem32ディレクトリにリダイレクトします。

Visual Studio 2012以降、アプリケーションプロジェクトのデフォルトは「任意のCPU 32ビット優先」です。このような実行可能ファイルを64ビットWindowsの オペレーティングシステムで実行すると、32ビットプロセスとして開始され、 はWOW64ファイルシステムのリダイレクトの影響を受けます。

64ビットWindows上の32ビットプロセスが 「C:¥Windows¥System32」にアクセスしようとすると、WOW64はそれを「C:\ Windows \ SysWOW64」にリダイレクトします。 本当アクセスするには、いくつかの方法があります "Cを:\ WINDOWS \ System32に" ディレクトリ:

  • 利用 "C:\ WINDOWS \ SysNative":にもかかわらずWOW64は "\ WINDOWS \ System32にC" にリダイレクトし、ディレクトリ の一覧には表示されません。これは簡単な方法であり、問​​題を起こす可能性は低いです。
  • Wow64DisableWow64FsRedirectionとWow64RevertWow64FsRedirectionを使用します。
  • 64ビットプロセスを使用します。

出典:https://social.msdn.microsoft.com/Forums/en-US/c54f8368-035e-478e-b988-b180a3c7e3da/file-not-found-for-existing-file-in-system32-directory?forum=csharpgeneral

+0

* "任意のCPU 32ビット優先" *は、.NETアプリケーションにのみ関係します。ただし、64ビットWindows上の32ビットプロセスのルールは、ネイティブ(C++)アプリケーションでも同じです。 – IInspectable

+0

公式のドキュメントは、[ファイルシステムリダイレクタ](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187.aspx)です。「* 32ビットアプリケーションは、ネイティブシステムディレクトリにアクセスすることができます'%windir%\ System32'の'%windir%\ Sysnative' WOW64はファイルシステムがアクセスをリダイレクトするべきでないことを示すために使用される特殊なエイリアスとして 'Sysnative'を認識します。ファイルシステムリダイレクトをバイパスするために推奨されるメカニズムです。64ビットアプリケーションは、実際の仮想ディレクトリではないため、 'Sysnative'エイリアスを使用できません。 –

4

あなたは二重のバックを使用する必要がありますが(ライン\n例えば、)、パスのスラッシュ:

"C:\\WINDOWS\\System32\\iluminated.dll" 

を別の方法として、あなたは前方に使用することができますスラッシュは、ほとんどのオペレーティングシステムで動作します。

"C:/WINDOWS/System32/iluminated.dll" 
+0

ああ、いいです。ありがとうございました。 –

+0

Btw。私は 'GetWindowsDirectory'関数によって返された単一のスラッシュを\\または'/'で置き換えることができますか? –

+0

@DonaldDuck、 'path.replace(" \ "、"/");' – SingerOfTheFall

関連する問題