2017-09-15 5 views
-1

Ich habe versucht, ein Programm zu machen, das Dateien über das Netzwerk kopiert, um Spielstände zwischen meinem PC und Notebook zu synchronisieren, wenn einer von ihnen aktualisiert. Das Problem ist, dass wenn ich das Programm laufen lasse, es einfach "kopiert" und nie endet. Jedoch, wenn ich es auf dem gleichen PC mit genau der gleichen Datei mache, tut es es sofort, ich habe auch versucht, einen TXT durch das Netzwerk zu senden, und es hat gut funktioniert. Irgendwelche Ideen? Hier ist mein Code:Kopieren von Dateien über das Netzwerk 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

Vielleicht liegt das Problem in der Funktion copy_file? – Saustin

+0

@Saustin Nicht sicher, aber ich denke, das kann std :: experimental :: filesystem sein. – Robinson

Antwort

0

Es gibt eine Menge Dinge, die es sein könnte, und ohne weitere Informationen so weit wie das, was Sie versucht haben, sind hier einige mögliche Dinge:

  • Sie haben eine gesperrte Datei, die momentan nicht gelesen werden kann und Ihr Programm kann nicht damit umgehen. Dies ist bei gerade laufenden Programmen im Verzeichnis üblich, oder wenn ein anderes Programm LockFile aufruft. Führst du das Spiel auf dem System aus, auf dem du schreiben willst?
  • Ihre Berechtigungen zum Lesen/Schreiben sind auf beiden Systemen durcheinander.
  • Ihr Netzwerk oder Ihre Festplatte ist wirklich, wirklich langsam. Sie haben gesagt, Sie verwenden std::experimental::filesystem. Dies ist experimentell und könnte eine nichttriviale Intuition erfordern.

Sie sagen, es hält "für immer kopieren." Gibt es Netzwerkverkehr? Suchen Sie mit Wireshark oder Resource Manager (Task-Manager, wenn Windows 10.)

+0

Ich glaube nicht, dass es gesperrt ist oder dass ich keine Erlaubnis habe, weil ich die Datei perfekt auf meinem eigenen PC verschieben kann. Es könnte ein Geschwindigkeitsproblem sein, aber ich ließ es mindestens 10 Minuten laufen (ich habe 100mbps Geschwindigkeit). Und ich benutze die Boost-Bibliothek nicht das std :: experimental :: filesystem. Ein Freund sagte, dass es einen Netzwerkpuffer von max 1Mb gibt, weißt du etwas darüber? –

+0

es hat einfach funktioniert! Es dauerte ungefähr 20 Minuten, aber es wurde kopiert. Wie kann man diese Geschwindigkeit verbessern? –

+0

Bitte akzeptieren Sie die Antwort, wenn Sie denken, dass es geholfen hat. Stellen Sie zunächst sicher, dass Sie nur Dateien übertragen, die übertragen werden müssen, um die Netzwerkübertragung zu beschleunigen. Sie können Datei-Hashes sowohl auf dem Client als auch auf dem Server berechnen. Wenn diese Optimierung nicht ausreicht, sollten Sie die Dateien in ein temporäres Verzeichnis kopieren und sie dann komprimieren, bevor Sie sie senden. Ich würde XZ verwenden, da es sich sehr gut komprimieren lässt und Sie den Kompromiss zwischen Leistung und Komprimierung optimieren können. – Saustin

Verwandte Themen