3

在我的项目中,我需要显示用户驱动器上按文件名过滤的所有文件,并带有文本行。有没有 API 可以做这样的事情?

我知道在 Windows 上,WinAPI 中有 FindFirstFile 和 FindNextFile 函数。

我使用 C++/Qt。

4

5 回答 5

4

ftw (),linux有fts ()

除此之外,您可以迭代目录,例如使用 opendir8/ readdir ()

于 2013-03-09T11:16:37.730 回答
3

Qt 提供了QDirIterator类:

QDirIterator iter("/", QDirIterator::Subdirectories);
while (iter.hasNext()) {
    QString current = iter.next();
    // Do something with 'current'...
}
于 2013-03-09T11:11:47.030 回答
2

如果你正在寻找一个 Unix 命令,你可以这样做:

find source_dir -name 'regex'

如果你想做 C++ 风格,我建议使用boost::filesystem。这是一个非常强大的跨平台库。
当然,您将不得不添加一个额外的库。

这是一个例子:

  std::vector<std::string> list_files(const std::string& root, const bool& recursive, const std::string& filter, const bool& regularFilesOnly)
        {
            namespace fs = boost::filesystem;
            fs::path rootPath(root);

            // Throw exception if path doesn't exist or isn't a directory.
            if (!fs::exists(rootPath)) {
                throw std::exception("rootPath does not exist");
            }
            if (!fs::is_directory(rootPath)) {
                throw std::exception("rootPath is not a directory.");
            }

            // List all the files in the directory
            const std::regex regexFilter(filter);
            auto fileList = std::vector<std::string>();

            fs::directory_iterator end_itr;
            for( fs::directory_iterator it(rootPath); it != end_itr; ++it) {

                std::string filepath(it->path().string());

                // For a directory
                if (fs::is_directory(it->status())) {

                    if (recursive && it->path().string() != "..") {
                        // List the files in the directory
                        auto currentDirFiles = list_files(filepath, recursive, filter, regularFilesOnly);
                        // Add to the end of the current vector
                        fileList.insert(fileList.end(), currentDirFiles.begin(), currentDirFiles.end());
                    }

                } else if (fs::is_regular_file(it->status())) { // For a regular file
                    if (filter != "" && !regex_match(filepath, regexFilter)) {
                        continue;
                    }

                } else {
                    // something else
                }

                if (regularFilesOnly && !fs::is_regular_file(it->status())) {
                    continue;
                }

                // Add the file or directory to the list
                fileList.push_back(filepath);
            }

            return fileList;
        }
于 2013-03-09T11:30:04.673 回答
1

您还可以使用glob http://man7.org/linux/man-pages/man3/glob.3.html 具有存在于许多 Unices(肯定是 Solaris)上的优势,因为它是 POSIX 的一部分。

好吧,它不是 C++,而是纯 C。

于 2013-03-09T11:46:03.443 回答
0

man findfind支持通过掩码过滤(例如-name选项)

于 2013-03-09T11:31:14.883 回答