Как скопировать и вставить файл в Windows с помощью C++?
я погуглил это, но я все еще смущен тем, как его использовать. Я создаю файловый менеджер, и я хочу иметь возможность копировать и вставлять файл в новый каталог. Я знаю, что для копирования нужно использовать file.copy()
, но я не уверен, как реализовать это в мой код.
Я хотел бы сделать это с помощью fstream.
6 ответов
если вы используете Win32 API, рассмотрите возможность просмотра функций CopyFile
или CopyFileEx
.
вы можете использовать первый способ, подобный следующему:
CopyFile( szFilePath.c_str(), szCopyPath.c_str(), FALSE );
это скопирует файл, найденный в содержимом szFilePath
на содержание szCopyPath
и FALSE
если копия не удалась. Чтобы узнать больше о том, почему функция не можно использовать GetLastError()
функция, а затем посмотрите вверх коды ошибок в документации Microsoft.
void copyFile(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(is), std::istream_iterator(),
std::ostream_iterator(os));
}
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs. 85).aspx
Я не знаю, что вы подразумеваете под копированием и вставкой файла; это не имеет смысла. Вы можете скопировать файл в другое место и я предполагаю, что вы спрашиваете.
вот моя реализация для копирования файла, вы должны взглянуть на файловую систему boost, так как эта библиотека будет частью стандартной библиотеки c++.
#include <fstream>
#include <memory>
//C++98 implementation, this function returns true if the copy was successful, false otherwise.
bool copy_file(const char* From, const char* To, std::size_t MaxBufferSize = 1048576)
{
std::ifstream is(From, std::ios_base::binary);
std::ofstream os(To, std::ios_base::binary);
std::pair<char*,std::ptrdiff_t> buffer;
buffer = std::get_temporary_buffer<char>(MaxBufferSize);
//Note that exception() == 0 in both file streams,
//so you will not have a memory leak in case of fail.
while(is.good() and os)
{
is.read(buffer.first, buffer.second);
os.write(buffer.first, is.gcount());
}
std::return_temporary_buffer(buffer.first);
if(os.fail()) return false;
if(is.eof()) return true;
return false;
}
#include <iostream>
int main()
{
bool CopyResult = copy_file("test.in","test.out");
std::boolalpha(std::cout);
std::cout << "Could it copy the file? " << CopyResult << '\n';
}
ответ Nisarg выглядит хорошо, но это решение медленное.
в родном C++ вы можете использовать:
- функция CopyFile:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851%28v=vs.85%29.aspx
- функция CopyFileEx для более продвинутых опций, таких как уведомления о прогрессе. http://msdn.microsoft.com/en-us/library/windows/desktop/aa363852%28v=vs.85%29.aspx