gpt4 book ai didi

c++ - 在 C++ 中发现文件

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:55 24 4
gpt4 key购买 nike

如何在 C++ 和所有 Windows 驱动程序中找到具有特定扩展名的文件列表

例如在 python 中:

import os

def discoverFiles(startpath): extensions = [ 'rar','pdf','mp3' ]

for dirpath, dirs, files in os.walk(startpath):
for i in files:
absolute_path = os.path.abspath(os.path.join(dirpath, i))
ext = absolute_path.split('.')[-1]
if ext in extensions:
yield absolute_path

x = 发现文件('/')对于我在 x 中: 打印我


Test my script for better understanding

请帮助我使用 windows api 代码或 C++ 内部库

最佳答案

这可以在跨平台庄园中使用 C++17 及更高版本中的标准库 file_system 组件来实现:https://en.cppreference.com/w/cpp/filesystem .在此之前,file_system 实现可通过 Boost(https://www.boost.org/doc/libs/1_68_0/libs/filesystem/doc/index.htm)或文件系统技术规范(在 std::experimental 命名空间中)获得

#include <filesystem>
#include <iostream>
#include <iterator>

namespace fs = std::filesystem;

auto discoverFiles(fs::path start_path)
{
std::vector<std::string> extensions = { ".rar", ".pdf", ".mp3" };
std::vector<std::string> files;
for (const auto& path : fs::recursive_directory_iterator(start_path))
{
if (std::find(extensions.begin(), extensions.end(), path.path().extension()) != extensions.end())
{
files.push_back(path.path().string());
}
}
return files;
}

int main(int argc, char *argv[])
{
auto files = discoverFiles( fs::current_path().root_path() );
std::copy(files.begin(), files.end(), std::ostream_iterator<std::string>(std::cout,
"\n"));
}

需要注意的几点是,这与您的 Python 实现不同,因为它无法访问 yield 关键字。由于这样的结果是预先计算的,而不是像 Python 那样被推迟到使用点,这可能会对内存使用和性能产生影响。一旦 C++ 获得协同例程的访问权限并随后可以在该语言中实现 yield 语义,这在未来可能会改变(关于如何将其包含在 C++20 中的讨论正在进行中,但它是否会实现还有待观察它进入这个版本的语言)

此外,这在 Windows 上进行了测试,它不喜欢从驱动器的根目录递归扫描并引发访问异常。但是,指定根目录下的任何文件夹都会导致它正常工作。

关于c++ - 在 C++ 中发现文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53130162/

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