如何判断给定路径是目录还是文件? (C / C ++)

时间:2008-09-28 22:42:10

标签: c++ c winapi

我正在使用C,有时我必须处理像

这样的路径
  • C:\无论
  • C:\无论\
  • C:\无论\ Somefile

有没有办法检查给定路径是目录还是给定路径是文件?

8 个答案:

答案 0 :(得分:102)

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
}

答案 1 :(得分:28)

调用GetFileAttributes,并检查FILE_ATTRIBUTE_DIRECTORY属性。

答案 2 :(得分:13)

在Win32中,我通常使用PathIsDirectory及其姐妹函数。这适用于Windows 98,GetFileAttributes没有(根据MSDN文档。)

答案 3 :(得分:8)

使用C ++ 14 / C ++ 17,您可以使用is_directory()中与平台无关的is_regular_file()filesystem library

#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;

section "File types"中列出了其他已实施的检查。

答案 4 :(得分:2)

在Windows上,您可以在GetFileAttributes上使用open handle

答案 5 :(得分:0)

这是一个使用 GetFileAttributesW 函数检查路径是否是 Windows 上的目录的简单方法。如果接收到的路径必须是目录或文件路径,那么如果它不是目录路径,您可以假设它是文件路径。

bool IsDirectory(std::wstring path)
{
    DWORD attrib = GetFileAttributes(path.c_str());

    if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
        return true;

    return false;
}

答案 6 :(得分:-2)

如果您使用CFile,可以尝试

CFileStatus status;
    if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){
       //it's directory
}

答案 7 :(得分:-4)

更容易在qt

中尝试FileInfo.isDir()