2012-02-18 56 views
1

我試圖複製一個文件,但無論我嘗試,複製似乎只是幾個字節。C++複製文件。數據短缺

_file是一個ifstream設置爲二進制模式。

void FileProcessor::send() 
{ 
    //If no file is opened return 
    if(!_file.is_open()) return; 
    //Reset position to beginning 
    _file.seekg(0, ios::beg); 

    //Result buffer 
    char * buffer; 
    char * partBytes = new char[_bufferSize]; 
    //Packet *p; 
    //Read the file and send it over the network 

    while(_file.read(partBytes,_bufferSize)) 
    { 
     //buffer = Packet::create(Packet::FILE,std::string(partBytes)); 
     //p = Packet::create(buffer); 
     //cout<< p->getLength() << "\n"; 
     //writeToFile(p->getData().c_str(),p->getLength()); 
     writeToFile(partBytes,_bufferSize); 
     //delete[] buffer; 
    } 

    //cout<< *p << "\n"; 
    delete [] partBytes; 
} 

_writeFile是要寫入的文件。

void FileProcessor::writeToFile(const char *buffer,unsigned int size) 
{ 
    if(_writeFile.is_open()) 
    { 
     _writeFile.write(buffer,size); 
     _writeFile.flush(); 
    } 
} 

在這種情況下,我試圖複製一個zip文件。 但打開記事本中的原件和副本我注意到,雖然它們看起來相同,但它在複製缺少幾個字節的末尾是不同的。

有什麼建議嗎?

+0

小建議:不要使用'_'來啓動變量名,其中大部分用途都是爲編譯器或標準庫保留的。 – ssube 2012-02-18 17:58:54

+0

儘管我希望適用我自己的慣例,但這並不取決於我。 – Sidar 2012-02-18 18:02:01

回答

2

您假定文件的大小是_bufferSize的倍數。你要檢查什麼留在緩衝後同時:當它失敗,因爲它擊中的EOF閱讀_bufferSize字節

while(_file.read(partBytes,_bufferSize)) { 
    writeToFile(partBytes,_bufferSize); 
} 
if(_file.gcount()) 
    writeToFile(partBytes, _file.gcount()); 
+0

是的!我之前嘗試過,但出於某種原因,我一直走出界限。 但是這個工程= D – Sidar 2012-02-18 18:12:21

0

您不希望總是這樣做writeToFile(partBytes,_bufferSize);,因爲有可能(最後)小於_bufferSize字節被讀取。此外,正如在對這個答案的評論中指出的那樣,一旦達到EOF,ifstream就不再是「真」了,所以最後的塊不會被複制(這是你發佈的問題)。相反,使用gcount()獲得的字節數讀:

do 
{ 
    _file.read(partBytes, _bufferSize); 
    writeToFile(partBytes, (unsigned int)_file.gcount()); 
} while (_file); 

對於zip文件比較,你可能要考慮使用非文本編輯器做比較; HxD是一個優秀的(免費)十六進制編輯器,帶有文件比較選項。

+0

有趣的是,從該方法到int的轉換不存在...? 有什麼建議嗎? – Sidar 2012-02-18 18:00:24

+0

@Sidar:是的,我一定是在想一個不同的'read()'函數,對不起。我用(希望)正確的代碼更新了我的答案! – Cameron 2012-02-18 18:04:21

+0

另外 - 我相信'istream :: read'可能會返回一個對象,如果它讀取的字節小於'_bufferSize'字節,它將轉換爲false,在這種情況下'while'的主體將不會被執行。 – user1071136 2012-02-18 18:06:53

0

您是否正在從一種介質複製到另一種介質?也許不同的行業規模造成了明顯的怪異感。

如果_bufferSize沒有平均分配到文件的大小......可能會導致額外的字節被寫入。

+0

在這一點上它都從桌面目錄寫入。 有趣的是,我的字節很短。 – Sidar 2012-02-18 18:10:02

1

while循環將終止。

最後一次調用read()可能讀取了一些數據(不是完整的緩衝區),但是您的代碼忽略了它。

在循環之後,您需要檢查_file.gcount(),如果不是零,請將剩餘的字節寫出。