我的任务是按文件名查找文件。搜索必须从C:\驱动器启动。当我在其他驱动器上测试我的功能时,比如D:\或A:\,一切都很好,但我试图用C:\驱动器来做,我使用的是g编译器,C 17,Windows操作系统。调用main.cpp中的函数
try {
if (SearchFile::find_file(fs::path("C:\\"), fileName)) {
return 0;
}
} catch (const fs::filesystem_error& e) {
std::cerr << "Error accessing filesystem: " << e.what() << std::endl;
std::cerr << "Exception path1: " << e.path1() << std::endl;
std::cerr << "Exception path2: " << e.path2() << std::endl;
}
for(const auto& drive : drives){
fs::path drivePath(drive);
std::string driveLetter = drivePath.string().substr(0, 1);
if (!(driveLetter == "C" || driveLetter == "c")) {
if (SearchFile::find_file(drivePath, fileName)) {
break;
}
}
}
字符串
我的函数,位于SearchFile类中
void SearchFile::search_in_directory(const fs::path &drive, const std::string &fileName,
std::atomic<bool> &foundFile, std::mutex &mutex) {
try {
for(const auto& file_iterator : fs::recursive_directory_iterator(drive,
fs::directory_options::skip_permission_denied)){
if(foundFile) return;
if(file_iterator.is_regular_file() && file_iterator.path().filename() == fileName){
std::lock_guard<std::mutex> lock(mutex);
std::cout << file_iterator.path() << std::endl;
foundFile = true;
return;
}
}
} catch (const fs::filesystem_error& e) {
// Print the exception details for debugging
std::cerr << drive.filename() << '\n';
std::cerr << "File system exception: " << e.what() << std::endl;
std::cerr << "Exception path1: " << e.path1() << std::endl;
std::cerr << "Exception path2: " << e.path2() << std::endl;
}
}
bool SearchFile::find_file(const std::filesystem::path &drive, const std::string &fileName) {
adjust_priviledges();
std::atomic<bool> found = false;
std::vector<std::thread> threads;
std::mutex mutex;
try {
for(const auto& file_iterator :
fs::recursive_directory_iterator(drive, fs::directory_options::skip_permission_denied)){
if (fs::is_symlink(file_iterator)) {
continue;
}
if(found) break;
if(fs::is_directory(file_iterator ) && threads.size() < MAX_THREADS ){
threads.emplace_back(&search_in_directory, file_iterator.path(),
fileName, std::ref(found), std::ref(mutex));
} else if(file_iterator.is_regular_file() && file_iterator.path().filename() == fileName){
std::lock_guard<std::mutex> lock(mutex);
std::cout << file_iterator.path() << std::endl;
found = true;
break;
}}
} catch (const fs::filesystem_error& e) {
std::cerr << "File system exception: " << e.what() << std::endl;
std::cerr << "Exception path1111: " << e.path1() << std::endl;
std::cerr << "Exception path2: " << e.path2() << std::endl;
}
for(auto& thread : threads){
thread.join();
}
return found;
}
型
大多数时候我都是这样的:“文件系统异常:文件系统错误:无法递增递归目录迭代器:尝试运行程序时参数“”无效。我也尝试AdjustPriviledges,但它仍然没有解决问题。此外,我还试图以管理员身份运行它,并禁用Windows Defender,仍然没有结果。
2条答案
按热度按时间g2ieeal71#
这里有一个使用Windows(特定于平台)
FindFirstFileEx
和FindNextFile
函数的参数。FIND_FIRST_EX_LARGE_FETCH
标志,它可以大大加快速度。FindExInfoBasic
标志,这会加快速度。WIN32_FIND_DATA
结构,其中包含相当多的有用信息(包括名称ofc)。ERROR_ACCESS_DENIED
)。MAX_PATH
(260)个字符的路径,尽管在系统驱动器上不太可能有必要。好好想想吧。这并不难,但您可能更希望代码是可移植的。正如其他人所说,摆脱所有这些线程。那面神奇的旗帜应该给予你所需要的表演。
mrfwxfqh2#
这看起来很可疑:
字符串
file_iterator.path()
返回一个路径示例的引用,其生存期不长于file_iterator本身的生存期。它通过引用传递给另一个线程中的search_in_directory
。路径示例甚至可以在线程启动之前被删除。让我们在通过引用传递之前复制路径和字符串,并保证其生命周期。我们可以传递
found
和mutex
作为引用这样做:
型
我不确定这是否是唯一的问题,但它肯定是一个问题。