2010-09-09 10 views
11

यह तेज/कुशल होगा एक फ़ाइल प्रतिलिपि दिनचर्या लिखने के लिए या मैं सिर्फ सीपी करने के लिए एक सिस्टम कॉल पर अमल करना चाहिए?सी ++ FileIO कॉपी-बनाम-प्रणाली ("cp file1.x file2.x)

(फ़ाइल सिस्टम भिन्न हो सकता है [एनएफएस, स्थानीय, पुनर्विक्रेता, आदि], हालांकि यह हमेशा एक सेंटोस लिनक्स सिस्टम पर होगा)

+0

संभव डुप्लिकेट: // stackoverflow.com/questions/10195343/copy-a-file-in-an-sane-safe-and- कुशल-way) –

उत्तर

20

Invoking एक shellsystem() फ़ंक्शन का उपयोग करके कुशल और बहुत सुरक्षित नहीं नहीं है।

लिनक्स में फ़ाइल की प्रतिलिपि बनाने का सबसे प्रभावी तरीका sendfile() सिस्टम कॉल का उपयोग करना है। विंडोज़ पर, CopyFile() एपीआई फ़ंक्शन या इसके संबंधित संस्करणों में से एक का उपयोग किया जाना चाहिए।

Examplesendfile का उपयोग कर:

#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/sendfile.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main (int argc, char* argv[]) 
{ 
int read_fd; 
int write_fd; 
struct stat stat_buf; 
off_t offset = 0; 

/* Open the input file. */ 
read_fd = open (argv[1], O_RDONLY); 
/* Stat the input file to obtain its size. */ 
fstat (read_fd, &stat_buf); 
/* Open the output file for writing, with the same permissions as the 
    source file. */ 
write_fd = open (argv[2], O_WRONLY | O_CREAT, stat_buf.st_mode); 
/* Blast the bytes from one file to the other. */ 
sendfile (write_fd, read_fd, &offset, stat_buf.st_size); 
/* Close up. */ 
close (read_fd); 
close (write_fd); 

return 0; 
} 

आप अपने कोड मंच निर्भर हो नहीं करना चाहते हैं, तो आप अधिक पोर्टेबल समाधान के साथ छड़ी कर सकते हैं - Boost File System library या std::fstream। बूस्ट

उदाहरण का उपयोग करते हुए (more complete example):

copy_file (source_path, destination_path, copy_option::overwrite_if_exists); 

उदाहरण का उपयोग करते हुए सी ++ std::fstream:

ifstream f1 ("input.txt", fstream::binary); 
ofstream f2 ("output.txt", fstream::trunc|fstream::binary); 
f2 << f1.rdbuf(); 
की [एक, समझदार सुरक्षित और कुशल तरीके से एक फाइल कॉपी] (http
+1

ज्यादातर मामलों में, फ़ाइलों की प्रतिलिपि ओएस तक छोड़ी जानी चाहिए। ओएस को और अधिक कुशल होना चाहिए क्योंकि फ़ाइल प्रतिलिपि जीवन में अपने उद्देश्यों में से एक है। –

+0

@ थॉमस, आप सही हैं। मैंने तदनुसार अपना जवाब अपडेट कर लिया है। धन्यवाद। –

0

अपनी खुद की दिनचर्या के साथ आप प्रतिलिपि बनाने के लिए इस्तेमाल किए गए ब्लॉक के आकार को नियंत्रित कर सकते हैं, जिसे आप नहीं कर सकते सीपी के साथ-साथ, आप डेटा पढ़ने और लिखने के लिए अलग-अलग धागे पैदा कर सकते हैं (प्रक्रिया को और तेज करने के लिए)। आखिरकार, बाहरी प्रक्रिया को बढ़ाने में अतिरिक्त समय लगता है (यदि आप छोटी फाइलों की प्रतिलिपि बनाते हैं तो महत्वपूर्ण)।

1

फ़ाइल कॉपी दिनचर्या लिखना समय प्रभावी नहीं होगा।

यह एक सीपी खोलने के लिए सिस्टम को कॉल करने के लिए संसाधन गहन है।

आप सिस्टम (फ़ंक्शन) कॉल को ढूंढकर बहुत बेहतर सेवा करेंगे जो आप फ़ाइल की प्रतिलिपि बनाने के लिए कर सकते हैं। जैसे यदि मैं सही ढंग से याद करता हूं तो विंडोज़ पर यह सिर्फ CopyFile(src, dst) है।

+0

ऐसा लगता है कि ओपी सिस्टम कॉल निष्पादित करके, क्या करने की सोच रहा था। –

+6

नहीं, सिस्टम() फ़ंक्शन को कॉल करना सिस्टम कॉल करने जैसा नहीं है। – Puppy

+2

'सिस्टम (" cp a.txt b.txt ") के लिए निष्पादन पथ;' 'विंडोज़ पर' CopyFile ("a.txt", "b.txt") से काफी अलग है। मुझे संदेह है कि कुछ अन्य प्लेटफॉर्म पर भी ऐसा ही मामला है। –

0

सी ++ फ़ाइल आईओ अधिक पोर्टेबल और अधिक निम्न स्तर है, इसलिए यह अधिक लचीला है।

0

मैं अपना पैसा डालूंगा कि ओएस फ़ाइल ए को फ़ाइल ए कॉपी करने का सबसे प्रभावी तरीका जानता है। यह किसी भी एपीआई कार्यों के लिए लागू होता है।

+0

आप हार जाएंगे - ओएस को "औसत" कार्य के लिए अनुकूलित किया गया है, और लगभग किसी विशेष कार्य के लिए अनुकूलन के लिए कमरा है। –

+0

किसी भी स्थिति में, आप बाइट्स को एक स्थान से दूसरे स्थान पर कॉपी कर रहे हैं। यह कैसे विशेष या अनुकूलित किया जा सकता है? –

+0

बस: यदि आप डेटा और स्रोत और लक्ष्य उपकरणों की मात्रा जानते हैं, तो आप प्रभावी ढंग से पढ़ने और लिखने के समानांतर कर सकते हैं। आप वास्तव में विशाल होने के लिए डेटा ब्लॉक का आकार समायोजित कर सकते हैं। आप एसिंक्रोनस पठन और लेखन (विंडोज़ पर, कम से कम, इसलिए यह इस विशेष प्रश्न के दायरे से बाहर है) का उपयोग कर सकते हैं। आप स्मृति-मैप की गई फ़ाइल के माध्यम से प्रतिलिपि बना सकते हैं (यह तेज़ होगा, बीटीडब्ल्यू)। –