2012-04-18 10 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! 
} 

Но это будет (предположительно) не бросать, если это символическая ссылка на каталог. То же самое можно сказать и об этом:

Есть ли лучший способ?

ответ

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.

Смежные вопросы