关于Windows:通过间歇性网络连接复制文件

关于Windows:通过间歇性网络连接复制文件

Copying Files over an Intermittent Network Connection

我正在寻找一种鲁棒的方式来通过Windows网络共享复制文件,该文件可以间歇性连接。 该应用程序通常在大型医院的无线移动工作站上使用,我假设连接可能会暂时断开或一次断开几分钟。 所涉及的文件大小通常约为200KB-500KB。 该应用程序是用VB6(ugh)编写的,但是我们经常最终使用Windows DLL调用。

谢谢!


我使用Robocopy取得了很好的效果。默认情况下,它将每30秒重试一次,直到遍历文件为止。


我不清楚您的实际问题是什么,所以我会提出一些想法。

  • 您是否需要可重新启动的副本(文件大小如此之小,似乎没什么大不了的)?如果是这样,请使用COPYFILERESTARTABLE查看CopyFileEx
  • 您是否需要可验证的副本?听起来好像已经通过验证散列来实现了。
  • 您想要更好的性能吗?这将很困难,因为听起来您无法在服务器上运行任何东西。否则,TransmitFile可能会有所帮助。
  • 您是否只是想开火而忘记操作?我想炮轰到robocopy或TeraCopy之类的东西上可以工作-但对我来说似乎有点不客气。
  • 您想知道网络何时恢复吗? IsNetworkAlive有您的答案。

根据目前为止我所知道的,我认为下面的伪代码将是我的方法:

1
2
3
4
5
6
7
8
9
10
sourceFile = Compress("*.*");
destFile ="X:\\files.zip";

int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE;
while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) {
   do {
     // optionally, increment a failed counter to break out at some point
     Sleep(1000);
   while (!IsNetworkAlive(NETWORKALIVELAN));
}

首先压缩文件可以保存对成功复制哪些文件以及需要重新启动哪些文件的跟踪。它还应该使副本运行得更快(较小的总文件大小,以及较大的单个文件大小),但以牺牲双方的CPU能力为代价。一个简单的批处理文件可以在服务器端将其解压缩。


尝试使用BITS(背景智能传输服务)。它是Windows Update使用的基础结构,可通过Win32 API访问,并且是专门为解决此问题而构建的。

它通常用于应用程序更新,但在任何文件移动情况下都可以正常工作。

http://www.codeproject.com/KB/IP/bitsman.aspx


我同意Robocopy作为解决方案...这就是为什么将该实用程序称为" Robust File Copy"

I've used Robocopy for this with excellent results. By default, it will retry every 30 seconds until the file gets across.

默认情况下,一百万次重试。这对于您的间歇连接应该足够了。

它还执行可重新启动的传输,并且您甚至可以限制数据包之间的间隔传输,以确保您不希望像其他程序使用同一连接(/ IPG开关)一样使用所有带宽?


嗯,似乎rsync做到了,并且不需要服务器/守护进程/安装(我认为是的)-仅$ rsync src dst。


您可以使用Microsoft SyncToy(免费)。

http://www.microsoft.com/Downloads/details.aspx?familyid=C26EFA36-98E0-4EE9-A7C5-98D0592D8C52&displaylang=en


在发送文件之后或之前简单地发送哈希并将其与收到的文件进行比较怎么样?那至少应该确保您有正确的文件。

如果您想全力以赴,则可以执行相同的过程,只是对文件的一小部分。然后,当您拥有所有部件时,将它们加入接收端。


短信(如果可用)有效。


推荐阅读