用md5或者shasum等命令列工具檢查一下src和dst的hash是否相同,不同則說明兩個檔案內容不同,同時把程式碼貼上來。另外懷疑題主使用了std::fstream以類似如下的方式複製檔案:// fin, fout是std::fstream的例項char ch;while(!fin.eof()) { fin.read(&ch, sizeof(ch)); fout.write(&ch, sizeof(ch));}(以前一個學妹做c++作業時就這麼寫過)這種方式會在目標檔案尾寫入原始檔末位元組兩次(讀完最後一個位元組時fin.eof()仍為true,fout.write多執行一次)。對於純文字檔案,目標檔案尾多一個位元組不影響文字編輯器正常顯示;對於.exe這種PE格式的可執行檔案,其檔案頭之後是節表(section table),記錄了其後每個section的長度和偏移量等資訊,檔案尾多出一個位元組並不影響PE loader正確載入該可執行檔案(已測試);對於.png,其檔案頭之後是一堆資料塊,每個資料塊的頭部仍然存有塊大小等資訊,檔案尾多出一個位元組也不會影響該影象的正常顯示(已測試)。然而對於msoffice的.docx,.pptx等檔案(實際上是zip壓縮檔案),若檔案尾多出一個位元組,相關程式在載入這樣的檔案時可能會因為驗證檔案完整性失敗而報錯“檔案損壞”。然而這些檔案內部仍有儲存長度和偏移量等資訊的機制,所以在點選“恢復文件”之後仍可被正確地解壓縮並顯示。
用md5或者shasum等命令列工具檢查一下src和dst的hash是否相同,不同則說明兩個檔案內容不同,同時把程式碼貼上來。另外懷疑題主使用了std::fstream以類似如下的方式複製檔案:// fin, fout是std::fstream的例項char ch;while(!fin.eof()) { fin.read(&ch, sizeof(ch)); fout.write(&ch, sizeof(ch));}(以前一個學妹做c++作業時就這麼寫過)這種方式會在目標檔案尾寫入原始檔末位元組兩次(讀完最後一個位元組時fin.eof()仍為true,fout.write多執行一次)。對於純文字檔案,目標檔案尾多一個位元組不影響文字編輯器正常顯示;對於.exe這種PE格式的可執行檔案,其檔案頭之後是節表(section table),記錄了其後每個section的長度和偏移量等資訊,檔案尾多出一個位元組並不影響PE loader正確載入該可執行檔案(已測試);對於.png,其檔案頭之後是一堆資料塊,每個資料塊的頭部仍然存有塊大小等資訊,檔案尾多出一個位元組也不會影響該影象的正常顯示(已測試)。然而對於msoffice的.docx,.pptx等檔案(實際上是zip壓縮檔案),若檔案尾多出一個位元組,相關程式在載入這樣的檔案時可能會因為驗證檔案完整性失敗而報錯“檔案損壞”。然而這些檔案內部仍有儲存長度和偏移量等資訊的機制,所以在點選“恢復文件”之後仍可被正確地解壓縮並顯示。