我正在使用C,有时我必须处理像
这样的路径有没有办法检查给定路径是目录还是给定路径是文件?
答案 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()