2013-07-29 22 views
6

Mam google to, ale nadal jestem zdezorientowany, jak z niego korzystać. Robię menedżera plików i chcę mieć możliwość kopiowania i wklejania pliku do nowego katalogu. Wiem, aby skopiować Potrzebuję użyć file.copy(), ale nie jestem pewien, jak wdrożyć go w moim kodzie.Jak mogę skopiować i wkleić plik w systemie Windows przy użyciu C++?

Chciałbym to zrobić za pomocą fstream.

+0

'CopyFile' działa, ale jak mogę to zrobić za pomocą fstream. –

+0

Następnie należy zmienić tytuł pytania i określić, że w pytaniu zamiast pytać o kopiowanie wkleić w oknach ... – UpAndAdam

Odpowiedz

5

Jeśli używasz API Win32 następnie rozważyć patrząc na funkcje CopyFile lub CopyFileEx.

można wykorzystywać jako pierwszy w sposób podobny do następującego:

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

Spowoduje to skopiowanie pliku znaleziono w treści szFilePath do treści szCopyPath, i powróci FALSE jeśli kopia była nieudana . Aby dowiedzieć się więcej o przyczynach niepowodzenia funkcji, można użyć funkcji GetLastError(), a następnie wyszukać kody błędów w Dokumentacji Microsoft.

+0

Nie używam WinAPI –

+1

Nie, ale powiedziałeś, że pracujesz "w systemie Windows", co oznacza, że ​​masz dostęp do Win32 API. Nie ma standardowego opakowania C++, które robi to samo co 'CopyFile/Ex()'. Jeśli chcesz mieć rozwiązanie wyłącznie w C++, musisz utworzyć i otworzyć plik docelowy, a następnie ręcznie przepuścić pętlę do pliku docelowego, np. Nisarg i dieram3. Nie tak wydajne, jak przy użyciu natywnego rozwiązania systemu operacyjnego. –

+0

I * zdecydowanie polecam * wywoływanie funkcji API zamiast toczenia własnego. –

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

Powinien być "istream_iterator ", lub jeszcze lepiej "istreambuf_iterator ". Podobnie dla 'ostream'. –

1

Oto moja implementacja do skopiowania pliku, powinieneś rzucić okiem na system plików boost, ponieważ biblioteka ta będzie częścią standardowej biblioteki 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'; 
} 

Odpowiedź Nisarg wygląda ładnie, ale to rozwiązanie jest powolne.

-3

System :: IO :: Plik :: Kopiuj ("Stara ścieżka", "Nowa ścieżka");

+0

Ali, czy mógłbyś usunąć tę odpowiedź? Istnieje już kilka istniejących i lepszych odpowiedzi. Jeśli masz krytykę któregokolwiek z nich, po prostu zdobądź wystarczającą reputację do komentowania.Przynajmniej wyjaśnienia, w tym niektóre dokumentacji MSDN, i tak dalej. Jest postem o niskiej jakości. – lpapp

Powiązane problemy