2017-09-15 1 views
-1

i, ai essayé de faire un programme qui copie les fichiers via le réseau pour synchroniser les sauvegardes de jeu entre mon PC et ordinateur portable chaque fois que l'un d'eux mises à jour. Le problème est que quand je cours le programme il continue juste à "copier" et ne finit jamais. Cependant, si je le fais sur le même PC avec exactement le même fichier, il le fait instantanément, j'ai également essayé d'envoyer un txt à travers le réseau et cela a très bien fonctionné. Des idées? Voici mon code:Copie de fichiers à travers le réseau 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

Peut-être que le problème est dans la fonction COPY_FILE? – Saustin

+0

@Saustin Je ne suis pas sûr mais je pense que cela peut être std :: experimental :: filesystem. – Robinson

Répondre

0

Il y a beaucoup de choses qu'il pourrait être, et sans plus d'informations pour autant que ce que vous avez essayé, voici quelques choses possibles:

  • Vous avez un fichier verrouillé qui ne peut pas être lu actuellement et votre programme ne sait pas comment le gérer. Ceci est courant avec les programmes en cours d'exécution dans le répertoire, ou si un programme différent appelle LockFile. Exécutez-vous le jeu sur le système que vous essayez d'écrire?
  • Vos droits de lecture/écriture sont altérés sur l'un ou l'autre système.
  • Votre réseau ou votre disque dur est vraiment très lent.
  • Vous avez dit que vous utilisez std::experimental::filesystem. Ceci est expérimental et pourrait nécessiter une intuition non triviale à utiliser.

Vous dites qu'il garde "la copie pour toujours." Y a-t-il du trafic réseau? Regardez en utilisant Wireshark ou Resource Manager (gestionnaire de tâches si Windows 10.)

+0

Je ne pense pas que ce soit verrouillé ou que je n'ai pas la permission parce que je peux déplacer le fichier parfaitement dans mon propre PC. Il pourrait s'agir d'un problème de vitesse mais je l'ai laissé fonctionner au moins pendant 10 minutes (j'ai une vitesse de 100mbps). Et j'utilise la bibliothèque boost pas le std :: experimental :: filesystem. Un ami a dit qu'il y a un tampon de réseau de 1Mb maximum savez-vous quelque chose à ce sujet? –

+0

ça a juste marché! il a fallu environ 20 minutes, mais il a copié. aucun moyen d'améliorer cette vitesse? –

+0

Veuillez accepter la réponse si vous pensez que cela a aidé. Pour accélérer le transfert réseau, vérifiez d'abord que vous transférez uniquement les fichiers à transférer. Vous pouvez calculer les hachages de fichiers sur le client et le serveur. Si cette optimisation ne suffit pas, envisagez de copier les fichiers dans un répertoire temporaire, puis de les compresser avant de les envoyer. Je voudrais utiliser xz car il est très bon à la compression et vous pouvez régler ce compromis entre la performance et la compression. – Saustin