Мне нравится простой потоковый подход с использованием стандартных операторов 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
Я не уверен, что есть другой стандартный, портативный способ удаления файла.