web-dev-qa-db-ja.com

CのWindowsにディレクトリが存在するかどうかをどのように確認しますか?

質問

Windows Cアプリケーションで、関数に渡されたパラメーターを検証して、指定されたパスが存在することを確認したい。*

CのWindowsにディレクトリが存在するかどうかをどのように確認しますか?

*存在を確認してから存在しないパスを使用するまでの間に競合状態になる可能性があることは理解していますが、対処できます。

追加の背景

ディレクトリが存在すること、または存在しないことを明示的に知ることは、許可が出てきたときに注意を要することがあります。ディレクトリが存在するかどうかを判断しようとして、プロセスにディレクトリまたは親ディレクトリにアクセスする権限がない可能性があります。 これは私のニーズには問題ありません。ディレクトリが存在しない場合ORアクセスできないため、両方ともアプリケーションで無効なパス障害として扱われるため、区別する必要はありません。(仮想)ボーナスポイントソリューションがこの区別を提供する場合。

C言語、Cランタイムライブラリ、またはWin32 APIのソリューションは問題ありませんが、理想的には、一般的に読み込まれるライブラリ(kernel32、user32など)に固執し、非標準ライブラリの読み込みを伴うソリューションを避けたいと思います。 (Shlwapi.dllの PathFileExists など)。繰り返しますが、ソリューションがクロスプラットフォームの場合、(仮想)ボーナスポイントです。

関連する

Win32プログラムを使用してファイルが存在するかどうかを確認するにはどうすればよいですか?

61
Zach Burlingame

このようなことをしてください:

BOOL DirectoryExists(LPCTSTR szPath)
{
  DWORD dwAttrib = GetFileAttributes(szPath);

  return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
         (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

GetFileAttributes ()メソッドはKernel32.dllに含まれています。

87
retrodrone

これは完全にプラットフォームに依存しないソリューションです(標準Cライブラリを使用)

編集:これをLinuxでコンパイルするには、<io.h> with <unistd.h>および_access with access。実際のプラットフォームに依存しないソリューションについては、Boost FileSystemライブラリを使用してください。

#include <io.h>     // For access().
#include <sys/types.h>  // For stat().
#include <sys/stat.h>   // For stat().

bool DirectoryExists( const char* absolutePath ){

    if( _access( absolutePath, 0 ) == 0 ){

        struct stat status;
        stat( absolutePath, &status );

        return (status.st_mode & S_IFDIR) != 0;
    }
    return false;
}

MBCSビルドとUNICODEビルドの両方をサポートするWindows固有の実装:

#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <tchar.h>

BOOL directory_exists( LPCTSTR absolutePath )
{
  if( _taccess_s( absolutePath, 0 ) == 0 )
  {
    struct _stat status;
    _tstat( absolutePath, &status );
    return (status.st_mode & S_IFDIR) != 0;
  }

  return FALSE;
}
23
dario_ramos

Shell Lightweight API(shlwapi.dll)へのリンクが問題ない場合は、 PathIsDirectory関数 を使用できます。

9
Simon Mourier

別のオプションは、シェル関数PathFileExists()です。

PathFileExists()ドキュメント

この関数は、「ファイルやディレクトリなどのファイルシステムオブジェクトへのパスが有効かどうかを判断します。」

4
Greg