我有一些代码可以列出目录中的文件。对于Windows系统,我希望最终得到与您在Windows资源管理器中看到的文件和文件夹匹配的文件和文件夹列表。例如,当我在Server 2016上列出C:\时,我想拥有Users
文件夹而不是Documents and Settings
联结。目前,我正在两者兼而有之,没有明显的区分方式。
我当前的代码如下:
boost::filesystem::directory_iterator itr(dir);
boost::filesystem::directory_iterator end;
Poco::SharedPtr<Poco::JSON::Array> fileList(new Poco::JSON::Array);
for (; itr != end; ++itr) {
boost::filesystem::path entryPath = itr->path();
Poco::File file(entryPath.string());
// ...
我尝试了Poco isLink()
方法,但是对于结点,它返回false。
我还尝试了Poco::DirectoryIterator
和Poco::SortedDirectoryIterator
的行为,它们的行为与Boost相同,而File access error: sharing violation: \pagefile.sys
的行为总是在读取C:\
时抛出char
。
理想情况下,此代码应包括Linux和MacOS系统上的符号链接,而忽略Windows上的连接。
答案 0 :(得分:0)
这就是我最终想到的。这不是一个完美的解决方案-与其说是适当的标识符,不如说是一种启发式方法-但对于我的用例来说,它似乎已经足够好了:
#ifdef _WIN32
#include <windows.h>
#endif
bool FileController::isNtfsJunction(const std::string& dirPath) const {
#ifdef _WIN32
DWORD attrs = GetFileAttributesA(dirPath.c_str());
if (INVALID_FILE_ATTRIBUTES == attrs) {
DWORD err = GetLastError();
logger.error("Could not determine if path is NTFS Junction: %s. Error: %s", dirPath, err);
return false;
}
return attrs & FILE_ATTRIBUTE_DIRECTORY &&
attrs & FILE_ATTRIBUTE_REPARSE_POINT &&
attrs & FILE_ATTRIBUTE_HIDDEN &&
attrs & FILE_ATTRIBUTE_SYSTEM;
#else
return false;
#endif
}