检查文件夹路径

Posted

技术标签:

【中文标题】检查文件夹路径【英文标题】:Check folder path 【发布时间】:2011-06-06 12:33:23 【问题描述】:

我正在尝试检查给定的路径是否存在。如果没有,我想在同一目录中创建一个具有给定名称的文件夹。

假设 pathOne:“/home/music/A”和 pathTwo:“/home/music/B”,这样文件夹 A 存在,但文件夹 B 不存在。如果用户给出的路径是 pathOne,则不会发生任何事情,但如果是 pathTwo,那么程序应该意识到它不存在于 /home 中并应该创建它。

我知道可以从文件中检查是否存在(使用 fopen 可以做到这一点),但我不知道如何为文件夹执行此操作!

【问题讨论】:

对此没有跨平台的解决方案。你的目标操作系统是什么? @Midas 它的 openSUSE。 P.S 如果可能的话,我希望它可以在所有 Linux 发行版上使用。 @Midas:有一些跨平台的解决方案使用一些可移植性库或其他,也许还有 C++0x。仍然合适的答案取决于目标平台和依赖要求。 【参考方案1】:

Windows 对 POSIX 的支持非常不稳定,但这是它可以做的事情之一,因此我的解决方案适用于 Linux/Mac/POSIX/Windows):

bool directory_exists( const std::string &directory )

    if( !directory.empty() )
    
        if( access(directory.c_str(), 0) == 0 )
        
            struct stat status;
            stat( directory.c_str(), &status );
            if( status.st_mode & S_IFDIR )
                return true;
        
    
    // if any condition fails
    return false;

bool file_exists( const std::string &filename )

    if( !filename.empty() )
    
        if( access(filename.c_str(), 0) == 0 )
        
           struct stat status;
           stat( filename.c_str(), &status );
           if( !(status.st_mode & S_IFDIR) )
               return true;
        
    
    // if any condition fails
    return false;

请注意,如果您愿意,可以轻松地将参数更改为 const char*

另请注意,可以通过检查different values of status.st_mode,以特定于平台的方式添加符号链接等。

【讨论】:

对你投了赞成票。恕我直言,这是最好的答案,因为您通过暗示操作系统接口的操作系统特定性质来解决可移植性问题。 BOOST 不是操作系统接口,它在许多嵌入式工具链中不可用。您提到 POSIX 和 Windows 片状支持很好。我讨厌人们只提到使用 BOOST 并获得金票。我认为 BOOST 是一个有效的替代方案,但它隐藏了这个答案开始涉及的底层操作系统机制。 可能需要#include 必要的标头才能使其正常工作。【参考方案2】:

您应该可以使用Boost Filesystem exists function。它也是便携式的。

有一个很好的教程描述了这个场景,命名为Using status queries to determine file existence and type - (tut2.cpp)

【讨论】:

【参考方案3】:

您可以使用'dirent.h' 中的opendir 函数并检查ENOENT 作为返回值。

此头文件在 Windows 上不可用。在 Windows 上,您使用 GetFileAttributes 并检查 INVALID_FILE_ATTRIBUTES 作为返回值。

【讨论】:

opendirlisting 目录很有用,buf 仅用于检查是否存在某些东西,这是巨大的矫枉过正。特别是因为在某些文件系统上,目录中的文件位于哈希树或搜索树中,因此检查文件是否存在并不涉及读取包含目录的内容。另请注意,在 unix 中相当于 windows GetFileAttributes 的是 stat @Jan Hudec:感谢stat。 :)【参考方案4】:

查看boost filesystem library。它有一个非常方便和高级的界面,例如exists(path)is_directory(path)

在 Linux 操作系统级别上,您可以使用 stat。

【讨论】:

以上是关于检查文件夹路径的主要内容,如果未能解决你的问题,请参考以下文章

在c#中检查路径中是不是存在文件夹?

如何检查文件路径是不是存在

Nodejs检查给定的字符串是不是是有效的文件系统路径而不实际检查文件系统

检查路径在 Python 中是不是有效,而不在路径的目标处创建文件

检查字符串是不是是有效的 Windows 目录(文件夹)路径

使用 JavaScript 检查 iOS 路径中是不是存在文件