C ++ IO с жестким диском - PullRequest
4 голосов
/ 05 мая 2010

Мне было интересно, существует ли какой-либо переносимый (Mac & Windows) метод чтения и записи на жесткий диск, выходящий за пределы iostream.h, в частности такие функции, как получение списка всех файлов в папке, перемещение файлов по кругу и т. д.

Я надеялся, что вокруг будет что-то вроде SDL, но пока мне не удалось найти много.

Есть идеи ??

Ответы [ 3 ]

11 голосов
/ 05 мая 2010

Может ли повысить файловую систему , может быть, вы ищете?

4 голосов
/ 05 мая 2010

Я тоже фанат boost::filesystem. Требуется минимальное усилие, чтобы написать то, что вы хотите. В следующем примере (просто чтобы вы почувствовали, как он выглядит), пользователь просит ввести путь и имя файла, и он получит пути ко всем файлам с этим именем, независимо от того, находятся ли они в корневом каталоге. или в любом подчиненном каталоге этого корневого каталога:

#include <iostream>
#include <string>
#include <vector>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;

void find_file(const path& root,
    const string& file_name,
    vector<path>& found_files)
{
    directory_iterator current_file(root), end_file;
    bool found_file_in_dir = false;
    for( ; current_file != end_file; ++current_file)
    {
        if( is_directory(current_file->status()) )
                find_file(*current_file, file_name, found_files);
        if( !found_file_in_dir && current_file->leaf() == file_name )
        {
                // Now we have found a file with the specified name,
                // which means that there are no more files with the same
                // name in the __same__ directory. What we have to do next,
                // is to look for sub directories only, without checking other files.
                found_files.push_back(*current_file);
                found_file_in_dir = true;
        }
    }
}

int main()
{
    string file_name;
    string root_path;
    vector<path> found_files;

    std::cout << root_path;
    cout << "Please enter the name of the file to be found(with extension): ";
    cin >> file_name;
    cout << "Please enter the starting path of the search: ";
    cin >> root_path;
    cout << endl;

    find_file(root_path, file_name, found_files);
    for( std::size_t i = 0; i < found_files.size(); ++i)
            cout << found_files[i] << endl;
}
3 голосов
/ 05 мая 2010

Не существует собственного способа C ++ для обхода структуры каталогов или списка файлов в каталоге кросс-платформенным способом. Это просто не встроено в язык. (Не зря!)

Лучше всего использовать кодовую среду, и есть множество хороших вариантов.

Увеличение файловой системы

Apache Portable Runtime

Ааа и мой личный фаворит - Qt

Хотя, если вы используете это, сложно просто использовать часть его файловой системы. Вы в значительной степени должны перенести все ваше приложение на определенные классы Qt.

...