2011-06-06 186 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