C ++, как перемещать файлы и копировать их с одного диска на другой без использования winapi? - PullRequest
4 голосов
/ 31 января 2012

Должно быть чисто c ++ , я знаю о системе ("copy c:\\test.txt d:\\test.txt");но я думаю, что это системная функция, а не c ++ решение, или я могу ошибаться?

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Попробуйте использовать copy_file из boost .

#include <boost/filesystem.hpp>

boost::filesystem::copy_file("c:\\test.txt","d:\\test.txt");

При возникновении ошибки будет выдано исключение. Смотрите эту страницу для получения дополнительной документации: http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/reference.html#copy_file

3 голосов
/ 31 января 2012

Как насчет std::fstream? Откройте один для чтения и другой для записи, и используйте std::copy, чтобы позволить стандартной библиотеке обрабатывать копирование.

Примерно так:

void copy_file(const std::string &from, const std::string &to)
{
    std::ifstream is(from, ios::in | ios::binary);
    std::ofstream os(to, ios::out | ios::binary);

    std::copy(std::istream_iterator<char>(is), std::istream_iterator<char>(),
              std::ostream_iterator<char>(os));
}
2 голосов
/ 31 января 2012

Мне нравится простой потоковый подход с использованием стандартных операторов STL:

std::ifstream ifs("somefile", std::ios::in | std::ios::binary);
std::ofstream ofs("newfile", std::ios::out | std::ios::binary);
ofs << ifs.rdbuf();

Идея в том, что существует operator<< (streambuf*) для std::ofstream, поэтому вы просто передаете ему streambuf, связанный с вашим входным потоком.

Для полноты вы можете сделать что-то вроде следующего:

bool exists(const std::string& s) {
    std::ifstream istr(s, std::ios::in | std::ios::binary);
    return istr.is_open();
}

void copyfile(const std::string& from, const std::string& to) {
    if (!exists(to)) {
        std::ifstream ifs(from, std::ios::in | std::ios::binary);
        std::ofstream ofs(to, std::ios::out | std::ios::binary);
        ofs << ifs.rdbuf();
    }
}

Это скопирует файл, только если место назначения еще не существует. Просто дополнительная проверка на здравомыслие:)

Что касается перемещения файла, в «стандартном» C ++ я, вероятно, скопировал бы файл (как указано выше), а затем удалил его, выполнив что-то вроде:

if (0 != remove(from.c_str())) {
    // remove failed
}

Помимо использования чего-то вроде boost Я не уверен, что есть другой стандартный, портативный способ удаления файла.

...