2011-06-06 181 views
2

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

让我们假设pathOne:“/ home/music/A”和pathTwo:“/ home/music/B”,使得文件夹A存在但文件夹B不存在。如果用户给出的路径是pathOne,但是如果它的pathTwo,则程序应该认识到它不存在于/ home中并且应该创建它。

我知道有可能从文件检查存在(与fopen它可能做到这一点),但我不知道如何做文件夹!

+0

没有跨平台的解决方案。你的目标操作系统是什么? – Midas 2011-06-06 12:34:38

+0

@Midas它的openSUSE。 P.S我希望它可以在所有Linux发行版上使用。 – 2011-06-06 12:38:01

+0

@Midas:有跨平台的解决方案使用一些可移植性库或另一种,也许还有C++ 0x。仍然适当的答案取决于目标平台和依赖性要求。 – 2011-06-06 12:41:19

回答

3

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

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

+2

'opendir'对于* listing *目录很有用,buf只是用来检查是否存在这是巨大的矫枉过正。特别是在某些文件系统中,目录中的文件位于散列或搜索树中,因此检查文件是否存在并不涉及读取包含目录的内容。还要注意,unix中相当于'GetFileAttributes'的窗口是'stat'。 – 2011-06-06 13:07:59

+0

@Jan Hudec:感谢'stat'。 :) – Midas 2011-06-06 15:42:09

1

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

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

4

的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以特定于平台的方式添加符号链接等。

+1

up-voted你。恕我直言,这是最好的答案,因为您通过暗示操作系统接口的操作系统特定性质来解决可移植性问题。 BOOST不是一个OS界面,它在许多嵌入式工具链中不可用。你提到的POSIX和Windows flaky支持不错。我讨厌当人们提到只使用BOOST并获得金色票证。我想BOOST是一个有效的选择,但它隐藏了这个答案开始涉及的底层操作系统机制。 – Eric 2014-10-11 23:40:47

+1

可能希望#include这个工作所需的标题。 – 2015-03-02 09:52:30