Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-网络上的文件夹同步_Delphi_Networking_Synchronization_File Copying - Fatal编程技术网

Delphi-网络上的文件夹同步

Delphi-网络上的文件夹同步,delphi,networking,synchronization,file-copying,Delphi,Networking,Synchronization,File Copying,我有一个连接到数据库的应用程序,可以在多用户模式下使用,多台计算机可以连接同一个数据库服务器来查看和修改数据。其中一个客户始终被指定为“主”客户。此主机还接收来自RS232或UDP输入的文本信息,并每秒将此数据记录到本地计算机上的文本文件中 我的问题是其他客户端需要从主客户端访问此数据。我只是想知道解决这个问题的最佳和最有效的方法。我正在考虑两种选择: 编写文件夹同步类以将远程(主)计算机上的文件夹与本地(客户端)计算机上的文件夹同步。这将是一个线程化的缓冲文件复制例程 实现客户机/服务器,以便

我有一个连接到数据库的应用程序,可以在多用户模式下使用,多台计算机可以连接同一个数据库服务器来查看和修改数据。其中一个客户始终被指定为“主”客户。此主机还接收来自RS232或UDP输入的文本信息,并每秒将此数据记录到本地计算机上的文本文件中

我的问题是其他客户端需要从主客户端访问此数据。我只是想知道解决这个问题的最佳和最有效的方法。我正在考虑两种选择:

  • 编写文件夹同步类以将远程(主)计算机上的文件夹与本地(客户端)计算机上的文件夹同步。这将是一个线程化的缓冲文件复制例程
  • 实现客户机/服务器,以便主计算机可以向连接和请求数据的任何客户机提供此数据。主机将通过TCP/UDP将文件发送到请求客户端
  • 解决方案必须考虑以下因素:

    a。日志文件每秒都会被写入。它必须避免任何潜在的文件锁定问题

    b。复制例程应仅复制在客户端计算机上已修改的文件之后修改的文件

    c。尽可能有效率

    d。所有的机器都在局域网上

    e。同步只需要执行一次,比如说,每10分钟左右执行一次

    f。数据量仅约为50MB,但一旦初始(首次)同步完成,则要传输的数据量将仅约为1MB。这将在未来增加


    使用哪种方法更好?利/弊是什么?我也看到了我正在考虑使用的帖子

    编写一个web服务接口,以便客户端可以连接到服务器并根据需要提取新数据。或者,您可以将其编写为订阅/推送机制,以便客户端连接到服务器“订阅”,然后服务器将所有新内容推送到已注册的客户端。客户端在注册时需要完全同步(获取自上次同步以来的所有更改),以防更新发生时处于脱机状态。

    这两种解决方案在LAN上都可以正常工作,由您选择。您可能还想考虑与您选择的技术相关的问题:

    • 部署灵活性。使用文件共享和文件复制需要文件共享才能工作,所有LAN用户都可以访问日志文件
    • 长期计划:文件共享仅适用于本地网络,而基于IP的解决方案适用于路由网络,包括Internet
    • 与IP解决方案相比,基于文件的解决方案更易于实现

    如果使用数据库,如果需要共享这些数据,为什么“主”会将数据写入文本文件而不是数据库

    为什么要发明轮子?改用。windows的程序包:

    例如,在主计算机上安装rsync服务器,在客户端计算机上安装rsync客户端,或者只在项目目录中放置文件。当需要时,客户端计算机上的应用程序应rsync.exe请求从服务器同步必要的文件


    要复制打开的文件,您需要设置Windows卷影复制服务。关于如何设置主机以允许使用Windows卷影复制复制打开的文件的非常详细的说明。

    如果将这些文本文件存储在数据库中,与存储要求相比,这些文本文件中的“有用”数据量微不足道。我考虑过这一点,但出于许多原因,决定不存储所有数据。为了在数据库服务器上节省廉价的磁盘空间,您需要花时间实施一个复杂的基于文件的同步解决方案,将非常相同的数据复制n次,而不是将它们存储到数据库中一次,这将很好地解决并发访问问题?是的,我知道,然而,发生这种情况还有其他原因。我只需要大约0.001%的数据,数据库服务器上的备份时间至关重要。在这种情况下,“廉价磁盘空间”实际上并不便宜,因为由于现场缺乏廉价的互联网接入,数据库数据需要保持在最低限度——数据需要通过昂贵的卫星通信在极其偏远的位置发送。这是一个很好的观点,谢谢。我不知道你在使用什么数据库,但是如果数据库备份非常重要,你可以使用两个单独的数据库(或模式),一个用于数据,一个用于日志,这样你就可以单独备份它们了。需要通过sat通信发送哪些数据?数据库是远程的吗?如果是这样,请在本地LAN中使用另一个DB(上面的d段)并将其用于日志。+1因为事实上,数据库解决方案确实是最容易实现的,而且它也是“可移植的”(通过TCP/IP工作,您可以从任何地方访问它)。任何开源(即:无许可费用)db都可以,存储开销将是最小的。+1感谢额外的问题。由于这个软件只会在局域网上使用(因为它总是在一个没有互联网的远程位置),我不必担心这一点。我在想,对于rsync来说,基于文件的也会更容易+1。上次我需要它时,我花了很长时间在delphi中开发一个解决方案。然后我放弃安装RSYNC,改用它,再也不回头了。这是一个unix/linux实用程序,但它在windows中工作得很好,而且已经构建了一个windows安装程序/服务;这是一个Linux工具,在Windows上还没有找到一个好的家。Windows端口(使用cygwin)有bug,有时由于未知原因无法工作。99%的时间它都能按预期工作,我使用它是因为99%对我来说已经足够好了,但是如果需要100%的可靠性,那就不是最好的选择@Simon,
    rsync
    ,使用它的Linux根,可以轻松地与