通过间歇性网络连接复制文件
我正在寻找一种可以通过间歇性连接在Windows网络共享上复制文件的可靠方法。该应用程序通常在大型医院的无线移动工作站上使用,我假设连接可能会暂时断开或者一次断开几分钟。所涉及的文件通常约为200KB 500KB。该应用程序是用VB6(ugh)编写的,但是我们经常最终使用Windows DLL调用。
谢谢!
解决方案
回答
尝试使用BITS(背景智能传输服务)。它是Windows Update使用的基础结构,可通过Win32 API进行访问,并且是专门为解决此问题而构建的。
它通常用于应用程序更新,但在任何文件移动情况下都应能很好地工作。
http://www.codeproject.com/KB/IP/bitsman.aspx
回答
在发送文件之后或者之前简单地发送哈希,然后将其与收到的文件进行比较,怎么样?至少应确保我们具有正确的文件。
如果我们要全力以赴,则可以执行相同的过程,但只处理文件的一小部分。然后,当我们拥有所有部件时,将它们加入接收端。
回答
我使用Robocopy取得了很好的效果。默认情况下,它将每30秒重试一次,直到遍历文件为止。
回答
我不清楚实际问题是什么,所以我会提出一些想法。
- 我们是否需要可重新启动的副本(文件大小如此之小,似乎并不重要)?如果是这样,请使用COPYFILERESTARTABLE查看CopyFileEx
- 我们是否需要可验证的副本?听起来好像已经通过验证散列来实现了。
- 我们想要更好的性能吗?这将变得很困难,因为听起来我们无法在服务器上运行任何东西。否则,TransmitFile可能会有所帮助。
- 我们是否只是想开火而忘记操作?我想炮轰到robocopy或者TeraCopy之类的东西上可以工作-但对我来说似乎有点hacky。
- 我们想知道网络何时恢复吗? IsNetworkAlive有答案。
根据目前为止我所知道的,我认为下面的伪代码将是我的方法:
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能力。一个简单的批处理文件可以在服务器端将其解压缩。
回答
短信(如果可用)。
回答
我同意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开关)一样使用所有带宽?
回答
我们可以使用Microsoft SyncToy(免费)。
http://www.microsoft.com/Downloads/details.aspx?familyid=C26EFA36-98E0-4EE9-A7C5-98D0592D8C52&displaylang=en
回答
嗯,似乎rsync做到了,并且不需要服务器/守护进程/安装,我认为它只是$ rsync src dst。