2012-04-18 36 views
4

我想檢查字符串name是否指向可以打開和讀取的文件,因此它可以是常規文件或符號鏈接。如何使用boost :: filesystem檢查文件是常規文件還是符號鏈接?

我第一次用這樣的:

std::ifstream in(name.c_str()); 
if (!in.is_open()) { 
    // throw exception! 
} 

但當name簡稱目錄名稱並沒有拋出異常。

現在我使用的是這樣的:

if (!fs::exists(name) || fs::is_directory(name)) { 
    // throw exception! 
} 

但它會(大概)不是,如果它是一個符號鏈接到一個目錄扔。這同樣如此:

if (!fs::is_regular_file(name) && !fs::is_symlink(name)) { 
    // throw exception! 
} 

有沒有更好的方法?

回答

2

從Boost.Filesystem v3開始,檢查它是否是普通文件已經做到了你想要的。下面是一個簡單的代碼:

#include <boost/filesystem.hpp> 

#include <iostream> 

namespace fs = boost::filesystem; 

int main(int argc, char* argv[]) { 
    if (argc > 1) { 
    auto status = fs::status(argv[1]); 

    if (status.type() == fs::regular_file) 
     std::cout << argv[1] << " is a valid path." << std::endl; 
    else 
     std::cout << argv[1] << " is not a valid path." << std::endl; 

    if (fs::symlink_status(argv[1]).type() == fs::symlink_file) 
     std::cout << "It is also a symlink." << std::endl; 

    } else { 
    std::cerr << "A path must be given." << std::endl; 
    } 

    return 0; 
} 

下面是一些輸出:

% ./fstest /bin # it is a symlink path 
/bin is not a valid path. 
It is also a symlink. 
% ./fstest /bin/ # it is a symlink path but dereferenced? (trailing /) 
/bin/ is not a valid path. 
% ./fstest /bin/zsoelim # it is a symlink                            
/bin/zsoelim is a valid path. 
It is also a symlink. 
% ./fstest /bin/soelim # it is not a symlink 
/bin/soelim is a valid path. 

因此,大家可以看到,boost::filesystem::status(path)返回有關的實際路徑的信息是否是一個符號鏈接(遵循真實位置)或不。另一方面,如果文件本身是符號鏈接,則boost::filesystem::symlink_status(path)返回信息。

更多信息可在boost docs找到。

相關問題