2017-09-15 158 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