web-dev-qa-db-ja.com

特定のパスがディレクトリかファイルかをどのように確認できますか? (C / C ++)

私はCを使用していますが、時々パスを処理する必要があります

  • C:\ Whatever
  • C:\ Whatever \
  • C:\ Whatever\Somefile

特定のパスがディレクトリであるか、特定のパスがファイルであるかを確認する方法はありますか?

39
DylanJ

GetFileAttributes を呼び出して、FILE_ATTRIBUTE_DIRECTORY属性を確認します。

28
Colen

stat()はこれを教えてくれます。

struct stat s;
if( stat(path,&s) == 0 )
{
    if( s.st_mode & S_IFDIR )
    {
        //it's a directory
    }
    else if( s.st_mode & S_IFREG )
    {
        //it's a file
    }
    else
    {
        //something else
    }
}
else
{
    //error
}
103
Mike F

Win32では、通常 PathIsDirectory とその姉妹関数を使用します。これはWindows 98で動作しますが、GetFileAttributesは動作しません(MSDNのドキュメントによる)。

13
jeffm

C++ 14/C++ 17では、プラットフォームに依存しない is_directory() および is_regular_file() を使用できます ファイルシステムライブラリ

#include <filesystem> // C++17
#include <iostream>
namespace fs = std::filesystem;

int main()
{
    const std::string pathString = "/my/path";
    const fs::path path(pathString); // Constructing the path from a string is possible.
    std::error_code ec; // For using the non-throwing overloads of functions below.
    if (fs::is_directory(path, ec))
    { 
        // Process a directory.
    }
    if (ec) // Optional handling of possible errors.
    {
        std::cerr << "Error in is_directory: " << ec.message();
    }
    if (fs::is_regular_file(path, ec))
    {
        // Process a regular file.
    }
    if (ec) // Optional handling of possible errors. Usage of the same ec object works since fs functions are calling ec.clear() if no errors occur.
    {
        std::cerr << "Error in is_regular_file: " << ec.message();
    }
}

C++ 14では std::experimental::filesystem

#include <experimental/filesystem> // C++14
namespace fs = std::experimental::filesystem;

追加の実装済みチェックは セクション「ファイルタイプ」 にリストされています。

9
Roi Danton

Windowsでは、 GetFileAttributesopen handle で使用できます。

2
Scott