2012-02-03 23 views
5

Bir dosyayı C++ kullanarak bir klasörden başka bir klasöre nasıl kopyalarım?Bir klasörden başka bir klasöre dosya kopyalama

+0

'cp' komutunu kullanmak veya' cp' için bir klon yazmak ister misiniz? –

+0

cp – user1165435

+0

için bir klon yazmak istiyorum komutları uygulamak istemiyorum. Başarılı kopyadan sonra dosyayı ilk klasörden silmek istiyorum. yardıma ihtiyacım var. – user1165435

cevap

1

Boost C++ kitaplıklarını kullanmak istiyorsanız, filesystem::copy_file()'a bakın. bazı potansiyel karmaşık sorunlar etrafında tefsirler

#include <fstream> 

// copy in binary mode 
bool copyFile(const char *SRC, const char* DEST) 
{ 
    std::ifstream src(SRC, std::ios::binary); 
    std::ofstream dest(DEST, std::ios::binary); 
    dest << src.rdbuf(); 
    return src && dest; 
} 

int main(int argc, char *argv[]) 
{ 
    return copyFile(argv[1], argv[2]) ? 0 : 1; 
} 

:

How to use copy_file in boost::filesystem?

+0

için yararlı bir adımdır. Şimdi copy_file C++ başlangıcının C++ 14'ten beri bir parçasıdır. – Tecoberg

8

Bu minimal gerekli kodu olmalıdır: hata işleme dosya adı karakteri Burada

copy_file kapsayan bir önceki soru() var kodlamalar ... ama sana bir başlangıç ​​verebilir.

-1

Aşağıdaki kod, tüm dosyaları bir dizinden diğerine kopyalayacaktır. Ben elle yazmak zorunda kalmadan kaynak dosya adını almak için std::filesystem::path::filename kullandım

#include <exception> 
#include <filesystem> 
#include <iostream> 

namespace fs = std::filesystem; 

int main() 
{ 
    fs::path sourceFile = "path/to/sourceFile.ext"; 
    fs::path targetParent = "path/to/target"; 
    auto target = targetParent/sourceFile.filename(); // sourceFile.filename() returns "sourceFile.ext". 

    try // If you want to avoid exception handling, then use the error code overload of the following functions. 
    { 
     fs::create_directories(targetParent); // Recursively create target directory if not existing. 
     fs::copy_file(sourceFile, target, fs::copy_options::overwrite_existing); 
    } 
    catch (std::exception& e) // Not using fs::filesystem_error since std::bad_alloc can throw too. 
    { 
     std::cout << e.what(); 
    } 
} 

: C++ 17'den std::filesystem::copy_file ile

#include <windows.h> 

/* 
BOOL Copy(char r_szPath[1024], char r_szDir[1024]) 
{ 
char l_szTemp[2048] = {0}; 
sprintf(l_szTemp,"%s\%s"r_szPath,r_szDir); 

if(IsDirectory(
}*/ 

#include <stdio.h> 
#include<conio.h> 

BOOL __Copy(char r_szSrcPath[1024],char r_szDesPath[1024]) 
{ 
WIN32_FIND_DATA FindFileData; 
HANDLE hFind; 
char l_szTmp[1025] = {0}; 
memcpy(l_szTmp,r_szSrcPath,1024); 


char l_szSrcPath[1025] = {0}; 
char l_szDesPath[1025] = {0}; 
memcpy(l_szSrcPath,r_szSrcPath,1024); 
memcpy(l_szDesPath,r_szDesPath,1024); 

char l_szNewSrcPath[1025] = {0}; 
char l_szNewDesPath[1025] = {0}; 

strcat(l_szTmp,"*"); 

hFind = FindFirstFile(l_szTmp, &FindFileData); 
if(hFind == NULL) return FALSE; 

do 
{ 

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
{ 
if(strcmp(FindFileData.cFileName,".")) 
{ 
if(strcmp(FindFileData.cFileName,"..")) 
{ 
printf ("The Directory found is %s<BR>, FindFileData.cFileName); 

sprintf(l_szNewDesPath,"%s%s\",l_szDesPath,FindFileData.cFileName); 

sprintf(l_szNewSrcPath,"%s%s\",l_szSrcPath,FindFileData.cFileName); 
CreateDirectory(l_szNewDesPath,NULL); 
__Copy(l_szNewSrcPath,l_szNewDesPath); 
} 
} 
} 
else 
{ 
printf ("The File found is %s<BR>, FindFileData.cFileName); 
char l_szSrcFile[1025] = {0}; 
char l_szDesFile[1025] = {0}; 
sprintf(l_szDesFile,"%s%s",l_szDesPath,FindFileData.cFileName); 
sprintf(l_szSrcFile,"%s%s",l_szSrcPath,FindFileData.cFileName); 
BOOL l_bRet = CopyFile(l_szSrcFile,l_szDesFile,TRUE); 

} 


} 
while(FindNextFile(hFind, &FindFileData)); 
FindClose(hFind); 
return TRUE; 
} 


int main(int argc, char *argv[]) 
{ 
__Copy("C:\fcdb\","E:\sandy\"); 
getch(); 
return 0; 
} 
+4

SO 'ya hoş geldiniz ... Yazınızı iyileştirmek için bunu silmeyi veya bu sorunları ele almayı düşünün 1. bu çalışma kodu değil,' ifadeleriyle ilgili ifadelerinizde bir hata sürüsü var. ' ve '..' .. ve boşluk bıraktığınız yerdeki yazım hatalarını unutma. 2. Buradaki soruya cevap vermediniz. Oluşturduğunuz bir soruya cevap verdiniz. 3. soru C++ ve Ubuntu için ... pencerelere özel şeyler kullanarak burada yararlı değildir 4. Lütfen kodunuzu girerek okunabilir – UpAndAdam

0

C++ kod çalışan

Onun. Ancak, std::filesystem::copy ile size hiç hedef yoluna dosya adı geçen atlayabilirsiniz:

fs::copy(sourceFile, targetParent, fs::copy_options::overwrite_existing); 

değiştirin hem işlevleri davranışını std::filesystem::copy_options ile.

İlgili konular