14

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

谢谢!

4

8 回答 8

14

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

于 2008-08-20T21:47:57.030 回答
5

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

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

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

于 2008-08-20T15:06:53.420 回答
5

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

  • 您是否想要可重新启动的副本(文件大小如此之小,这似乎没什么大不了的)?如果是这样,请查看带有 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 能力。一个简单的批处理文件就可以在服务器端解压。

于 2008-08-21T10:54:09.727 回答
2

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

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

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

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

于 2008-09-02T13:51:57.083 回答
0

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

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

于 2008-08-20T15:08:15.757 回答
0

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

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

于 2008-09-17T05:10:24.620 回答
0

嗯,似乎 rsync 可以做到,并且不需要服务器/守护进程/安装,我认为可以 - 只需 $ rsync src dst。

于 2008-09-17T21:39:25.583 回答
-1

SMS(如果可用)有效。

于 2008-08-21T21:23:10.323 回答