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 は、POSIXの一部であるため、多くのUnices(確かにSolaris)に存在するという利点があります。

わかりました。C++ではなく純粋なCです。

于 2013-03-09T11:46:03.443 に答える
0

見てくださいman findfindマスクによるフィルタリングをサポート(例の-nameオプション)

于 2013-03-09T11:31:14.883 に答える