2017-09-15 75 views
-1

我一直在試圖製作一個程序,通過網絡複製文件,以在我的電腦和筆記本電腦之間同步遊戲保存,只要其中一個更新。問題是,當我運行該程序時,它只是保持「複製」,永遠不會結束。但是,如果我在同一臺電腦上使用完全相同的文件,它會立即執行此操作,但我也嘗試通過網絡發送一個txt文件,它工作得很好。有任何想法嗎?這裏是我的代碼:通過網絡複製文件C++

void copyFile() { 
char x; 
path PC = "C:\\Users\\Luciano\\Documents\\Sports Interactive\\Football Manager Touch 2017\\games\\River.fmt"; 
path Notebook = "Z:\\games\\River.fmt"; 
std::time_t lastWriteTo=0, lastWriteFrom=0; 
if(exists(PC)){lastWriteFrom = last_write_time(PC);} 
if(exists(Notebook)){lastWriteTo = last_write_time(Notebook);} 

if (lastWriteFrom > lastWriteTo || !exists(Notebook)) { 
    std::cout << "Hay que copiar de la PC a la notebook" << std::endl; 
    std::cout << "Copiar Archivo? Este es de :" << (file_size(PC)/1024)/1024 << " Mb (S/N)" << std::endl; 
    std::cin >> x; 
    switch (x) { 
    case 'S': 
     std::cout << "Copiando Archivo..." << std::endl; 
     try { 
      copy_file(PC, Notebook, copy_option::overwrite_if_exists); 
     } 
     catch (filesystem_error &e) { 
      std::cerr << e.what() << '\n'; 
     } 
     break; 
    case 's': 
     std::cout << "Copiando Archivo..." << std::endl; 
     try { 
      copy_file(PC, Notebook, copy_option::overwrite_if_exists); 
     } 
     catch (filesystem_error &e) { 
      std::cerr << e.what() << '\n'; 
     } 
     break; 
    default: 
     std::cout << "Se ha cancelado la copia del archivo" << std::endl; 
     break; 
    } 
} 
else if(lastWriteFrom < lastWriteTo || !exists(PC)){ 
    std::cout << "Hay que copiar de la notebook a la PC" << std::endl; 
    std::cout << "Copiar Archivo? Este es de :"<< (file_size(PC)/1024)/1024 <<"(S/N)" << std::endl; 
    std::cin >> x; 
    switch (x) { 
    case 'S': 
     std::cout << "Copiando Archivo..." << std::endl; 
     try { 
      copy_file(Notebook, PC, copy_option::overwrite_if_exists); 
     } 
     catch (filesystem_error &e) { 
      std::cerr << e.what() << '\n'; 
     } 
     break; 
    case 's': 
     std::cout << "Copiando Archivo..." << std::endl; 
     try { 
      copy_file(Notebook, PC, copy_option::overwrite_if_exists); 
     } 
     catch (filesystem_error &e) { 
      std::cerr << e.what() << '\n'; 
     } 
     break; 
    default: 
     std::cout << "Se ha cancelado la copia del archivo" << std::endl; 
     break; 
    } 
}else { 
    std::cout << "No es necesario la copia del archivo." << std::endl; 
} 

}

+0

也許問題是在copy_file函數? – Saustin

+0

@Saustin不知道,但我認爲這可能是std :: experimental :: filesystem。 – Robinson

回答

0

有很多事情可能是,並沒有更多的信息,只要你嘗試過什麼,這裏有一些潛在的東西:

  • 你有一個鎖定的文件,目前無法讀取,你的程序不知道如何處理它。這在目錄中正在運行的程序中很常見,或者如果其他程序調用LockFile。你正在試圖寫入的系統上運行遊戲嗎?
  • 您的閱讀/寫作權限在任一系統上都會混亂。
  • 您的網絡或硬盤真的很慢。
  • 你說你使用std::experimental::filesystem。這是實驗性的,可能需要使用一些不平凡的直覺。

你說它保持「永遠複製」。有沒有網絡流量?看看使用Wireshark或資源管理器(任務管理器,如果Windows 10)

+0

我不認爲它被鎖定或我沒有權限,因爲我可以在我自己的PC中完美地移動文件。它可能是速度問題,但我至少保持10分鐘(我有100mbps的速度)。我使用boost庫而不是std :: experimental :: filesystem。一位朋友說,有一個最大1Mb的網絡緩衝區,你知道這件事嗎? –

+0

它剛剛工作!它花了大約20分鐘,但它複製。任何方式來提高速度? –

+0

如果您認爲它有幫助,請接受答案。要加速網絡傳輸,請首先確保您只傳輸需要傳輸的文件。您可以計算客戶端和服務器上的文件哈希值。如果此優化不夠,請考慮將文件複製到臨時目錄,然後在將它們發送出去之前進行壓縮。我會使用xz,因爲它非常適合壓縮,並且可以調整性能和壓縮之間所需的折衷。 – Saustin