2013-07-29 42 views
6

Tôi đã googled điều này, nhưng tôi vẫn còn bối rối về cách sử dụng nó. Tôi đang tạo một trình quản lý tệp và tôi muốn có thể sao chép và dán tệp vào một thư mục mới. Tôi biết sao chép tôi cần sử dụng file.copy(), nhưng tôi không chắc chắn làm thế nào để thực hiện nó vào mã của tôi.Làm cách nào để sao chép và dán tệp trong Windows bằng C++?

Tôi muốn thực hiện điều này bằng cách sử dụng fstream.

+0

'CopyFile' không hoạt động, nhưng làm cách nào tôi có thể thực hiện điều này bằng cách sử dụng fstream. –

+0

Sau đó, bạn nên thay đổi tiêu đề của câu hỏi của bạn và chỉ định rằng trong câu hỏi thay vì yêu cầu sao chép dán trong cửa sổ ... – UpAndAdam

Trả lời

5

Nếu bạn đang sử dụng API Win32 sau đó xem xét nhìn vào các chức năng CopyFile hoặc CopyFileEx.

Bạn có thể sử dụng đầu tiên trong một cách tương tự như sau:

CopyFile(szFilePath.c_str(), szCopyPath.c_str(), FALSE); 

này sẽ sao chép các tập tin tìm thấy ở các nội dung của szFilePath đến nội dung của szCopyPath, và sẽ trở lại FALSE nếu bản sao đã không thành công . Để tìm hiểu thêm về lý do tại sao chức năng thất bại, bạn có thể sử dụng chức năng GetLastError() và sau đó tra cứu các mã lỗi trong Tài liệu Microsoft.

+0

Tôi không sử dụng WinAPI –

+1

Không, nhưng bạn đã nói rằng bạn đang làm việc "trong Windows", có nghĩa là bạn có quyền truy cập vào API Win32. Không có trình bao bọc C++ chuẩn nào thực hiện điều tương tự 'CopyFile/Ex()'. Nếu bạn muốn có một giải pháp C++ thuần túy, bạn sẽ phải tạo và mở tệp đích, sau đó lặp lại thủ công các byte sao chép tệp nguồn tới tệp đích, như Nisarg và dieram3 đã cho thấy. Không hiệu quả bằng cách sử dụng giải pháp hệ điều hành gốc. –

+0

Tôi * khuyên bạn nên * gọi chức năng API thay vì tự làm. –

4
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)); 
} 
+0

Phải là 'istream_iterator ' hoặc tốt hơn 'istreambuf_iterator '. Tương tự như vậy cho 'ostream'. –

1

Đây là triển khai của tôi để sao chép tệp, bạn nên xem xét hệ thống tệp tăng vì thư viện đó sẽ là một phần của thư viện chuẩn 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'; 
} 

Câu trả lời của Nisarg có vẻ đẹp, nhưng giải pháp đó chậm.

-3

Hệ thống :: IO :: Tệp :: Sao chép ("Đường dẫn cũ", "Đường dẫn mới");

+0

Ali, bạn có thể vui lòng xóa câu trả lời này không? Hiện có một vài câu trả lời hiện có và tốt hơn. Nếu bạn có một nhà phê bình cho bất kỳ ai trong số họ, chỉ cần có đủ danh tiếng để bình luận.Ít nhất, cung cấp một số giải thích, bao gồm một số tài liệu MSDN, v.v. Nó là một bài viết chất lượng thấp như nó đứng. – lpapp

Các vấn đề liên quan