gpt4 book ai didi

c++ - 如何使用 boost::filesystem 检查文件是常规文件还是符号链接(symbolic link)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:46 25 4
gpt4 key购买 nike

我想检查字符串 name 是否指向我可以打开和读取的文件,因此它可以是常规文件或符号链接(symbolic link)。

我第一次用这个:

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

但是当 name 引用目录名称时它没有抛出异常。

现在我正在使用这个:

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

但如果它是目录的符号链接(symbolic link),它(大概)不会抛出异常。这也是同样的道理:

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

有没有更好的办法?

最佳答案

从 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) 返回有关实际路径的信息,无论它是否是符号链接(symbolic link)(跟随到实际位置)。另一方面,boost::filesystem::symlink_status(path) 返回文件本身是否为符号链接(symbolic link)的信息。

更多信息可以在 boost docs 上找到.

关于c++ - 如何使用 boost::filesystem 检查文件是常规文件还是符号链接(symbolic link)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10201483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com