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

谢谢!

有帮助吗?

解决方案

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

  • 您是否想要可重新启动的副本(文件大小如此之小,这似乎没什么大不了的)?如果是这样,请看 CopyFileEx 与 COPYFILERESTARTABLE
  • 您想要可验证的副本吗?听起来您已经通过验证哈希值获得了这一点。
  • 您想要更好的性能吗?这会很困难,因为听起来你无法在服务器上运行任何东西。否则, 传输文件 可能有帮助。
  • 您只想进行即发即忘操作吗?我想花钱去 robocopy,或者 泰拉复制 或者有些东西会起作用 - 但对我来说似乎有点老套。
  • 您想知道网络何时恢复吗? 网络是否活跃 有你的答案。

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

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 功率。一个简单的批处理文件就可以在服务器端解压它。

其他提示

我用过 机器人复制 为此取得了优异的成绩。默认情况下,它将每 30 秒重试一次,直到文件通过。

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

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

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

我同意 Robocopy 作为解决方案......这就是为什么调用该实用程序 “强大的文件复制”

我为此使用了 Robocopy,效果非常好。默认情况下,它将每 30 秒重试一次,直到文件通过。

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

它还可以进行可重新启动的传输,您甚至可以通过数据包之间的间隙来限制传输,以防您不想使用所有带宽,因为其他程序正在使用相同的连接(/IPG 开关)?

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

如果您想全力以赴,您可以执行相同的过程,但对于文件的一小部分。然后,当你拥有所有碎片后,将它们连接到接收端。

嗯,似乎 rsync 可以做到这一点,并且不需要 server/daemon/install 我认为它可以 - 只需 $ rsync src dst。

短信(如果可用)可以使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top