鉴于自从回答这个问题以来已经过去了很多年,我正在添加这个答案。这个答案适用于更高版本的linux。它还使用了std::filesystem
c++17 中引入的新功能。 std::filesystem
在早期版本的 c++ 中可以通过 boost 或命名空间std::experimental::filesystem
(use #include <experimental/filesystem>
) 使用。如果使用 boost,则必须包含已编译的组件system
此示例还计算出符号链接指向的位置并返回它的规范名称。
#include <iostream>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/asio.hpp>
using std::cout;
namespace fs = boost::filesystem;
std::vector<std::string> get_available_ports() {
std::vector<std::string> port_names;
fs::path p("/dev/serial/by-id");
try {
if (!exists(p)) {
throw std::runtime_error(p.generic_string() + " does not exist");
} else {
for (fs::directory_entry &de : fs::directory_iterator(p)) {
if (is_symlink(de.symlink_status())) {
fs::path symlink_points_at = read_symlink(de);
fs::path canonical_path = fs::canonical(symlink_points_at, p);
port_names.push_back(canonical_path.generic_string());
}
}
}
} catch (const fs::filesystem_error &ex) {
cout << ex.what() << '\n';
throw ex;
}
std::sort(port_names.begin(), port_names.end());
return port_names;
}