代码之家  ›  专栏  ›  技术社区  ›  Eric Pohl

通过间歇性网络连接复制文件

  •  13
  • Eric Pohl  · 技术社区  · 17 年前

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

    谢谢!

    8 回复  |  直到 14 年前
        1
  •  5
  •   Jeff Atwood    17 年前

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

    • 您想要可重新启动的拷贝吗(文件太小了,看起来不是那么重要)?如果是这样,看看 CopyFileEx with COPYFILERESTARTABLE
    • 您想要可验证的副本吗?听起来你已经通过验证散列得到了它。
    • 你想要更好的表演吗?这将是困难的,因为听起来你不能在服务器上运行任何东西。否则, TransmitFile 也许有帮助。
    • 你只是想失火而忘记手术吗?我想是去机器人医院,或者 TeraCopy 或者一些有用的东西——但在我看来有点老土。
    • 你想知道网络什么时候回来吗? 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电源。一个简单的批处理文件可以在服务器端对其进行解压缩。

        2
  •  13
  •   sven    17 年前

    我已经用过 Robocopy 为此,取得了优异的成绩。默认情况下,它将每隔30秒重试一次,直到文件通过。

        3
  •  5
  •   TheSmurf    17 年前

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

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

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

        4
  •  1
  •   Greg    17 年前

    我同意Robocopy作为解决方案……这就是为什么该实用程序被称为 “可靠的文件副本”

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

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

    它还可以重新启动传输,您甚至可以限制数据包之间的传输,假设您不想使用所有带宽,因为其他程序使用相同的连接(/ipg开关)?.

        5
  •  0
  •   Erik van Brakel scottrakes    17 年前

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

    如果你想全力以赴,你可以做同样的过程,但文件的一小部分。然后,当你拥有了所有的片段,在接收端将它们连接起来。

        7
  •  0
  •   Ljubomir Josifovski    17 年前

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

        8
  •  -1
  •   Shawn    17 年前

    如果可以的话,发短信。