2013-01-09 18 views
5

से तेज है इसलिए, मैं फ़ाइलों को विलय करने के लिए एक C++ निष्पादन योग्य फ़ाइल बना देता हूं। मेरे पास 100 एमबी के आकार के साथ 43 फाइलें हैं। तो कुल 4.3 जीबी।अंतरिक्ष के बिना विलय फ़ाइल अंतरिक्ष

दो मामलों:

एक: फ़ाइल नाम हैं 1, 2, 3, 4, 5, 6, ..., 43 इसके बारे में 2 मिनट लगते हैं विलय खत्म करने के लिए।

दो: यदि फ़ाइल का नाम यह फ़ाइल है .ova0, यह File.ova1, ..., यह File.ova42 विलय समाप्त करने में लगभग 7 मिनट लगेंगे।

यह वही सटीक फ़ाइल है, मैं बस फ़ाइल का नाम बदलता हूं। कोई विचार क्या गलत है?

@ECHO OFF 

Combiner.exe "This File.ova0" "This File.ova1" "This File.ova2" 

PAUSE 

या

@ECHO OFF 

Combiner.exe 1 2 3 

PAUSE 

दोनों .bat फ़ाइल के अंत तक चला जाता है:

यह C++ कोड

#include <iostream> 
#include <fstream> 

#include <vector> 
#include <string> 

#include "boost/filesystem.hpp" 

namespace bfs = boost::filesystem; 

#pragma warning(disable : 4244) 


typedef std::vector<std::string> FileVector; 
int main(int argc, char **argv) 
{ 

    int bucketSize = 3024 * 3024; 

    FileVector Files; 

    //Check all command-line params to see if they exist.. 
    for(int i = 1; i < argc; i++) 
    { 
     if(!bfs::exists(argv[i])) 
     { 
      std::cerr << "Failed to locate required part file: " << argv[i] << std::endl; 
      return 1; 
     } 

     //Store this file and continue on.. 
     std::cout << "ADDING " << argv[i] << std::endl; 
     Files.push_back(argv[i]); 
    } 

    //Prepare to combine all the files.. 
    FILE *FinalFile = fopen("abc def.ova", "ab"); 

    for(int i = 0; i < Files.size(); i++) 
    { 
     FILE *ThisFile = fopen(Files[i].c_str(), "rb");  

     char *dataBucket = new char[bucketSize]; 

     std::cout << "Combining " << Files[i].c_str() << "..." << std::endl; 

     //Read the file in chucks so we do not chew up all the memory.. 
     while(long read_size = (fread(dataBucket, 1, bucketSize, ThisFile))) 
     { 
      //FILE *FinalFile = fopen("abc def.ova", "ab"); 
      //::fseek(FinalFile, 0, SEEK_END); 
      fwrite(dataBucket, 1, read_size, FinalFile); 
      //fclose(FinalFile); 
     } 

     delete [] dataBucket; 
     fclose(ThisFile); 
    } 
    fclose(FinalFile); 

    return 0; 
} 

मैं इस तरह .bat फ़ाइल के माध्यम से इसे चलाने है फ़ाइल का नाम, मैंने अभी यहां 3 फाइलें लिखी हैं, अन्यथा यह बहुत लंबा होगा

धन्यवाद

+1

क्या आप यह सुनिश्चित करने के लिए कई बार चलाते हैं कि यह कमन व्यवहार है? – hmatar

+0

हाँ .. मैं इसे लगभग 10 गुना चलाता हूं, और यह लगभग मुझे मिलता है। – Harts

+4

चूंकि आप सी ++ का उपयोग कर रहे हैं और सी नहीं, तो आप 'fopen' से 'fstream' के साथ बेहतर हो जाएंगे। – Foggzie

उत्तर

1

डिफ़ॉल्ट रूप से, विंडोज डिस्क डेटा को डिस्क से पढ़ता है और डिस्क पर लिखा जाता है। इसका तात्पर्य यह है कि पढ़ना संचालन सिस्टम डिस्क में किसी फ़ाइल से फ़ाइल डेटा को पढ़ता है जिसे भौतिक डिस्क के बजाय सिस्टम फ़ाइल कैश के रूप में जाना जाता है। इसके अनुरूप, लेखन ऑपरेशन डिस्क फ़ाइल के बजाय सिस्टम फ़ाइल कैश में फ़ाइल डेटा लिखते हैं, और इस प्रकार के कैश को लिखने वाले कैश के रूप में जाना जाता है। कैशिंग को प्रति फ़ाइल ऑब्जेक्ट प्रबंधित किया जाता है: अधिक जानकारी: File Caching

संबंधित मुद्दे