Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
.net 局域网中的多台计算机正在向服务器文件追加行。我如何避免可能的冲突?_.net_File_Io - Fatal编程技术网

.net 局域网中的多台计算机正在向服务器文件追加行。我如何避免可能的冲突?

.net 局域网中的多台计算机正在向服务器文件追加行。我如何避免可能的冲突?,.net,file,io,.net,File,Io,(.NET环境) 有几个客户端机器B。。。N访问服务器a上的文本文件以向其附加一行(这些行是a执行某项操作的指令,文件本身是FIFO指令队列)。这个文件很小,而且大多数时候都是空的。A上有一些应用程序会将行附加到此文件 机器B到N只写这个文件,但它是不可预见的,所以访问冲突很可能经常发生 机器A每秒检查一次该文件,在执行上述指令的同时逐行删除所有当前存在的行(FIFO)。当然,这里存在很高的访问冲突可能性(因为客户端碰巧当前附加到文件中),但这是可以忽略的,因为预期的操作可以简单地中止(因为无论

(.NET环境)

有几个客户端机器B。。。N访问服务器a上的文本文件以向其附加一行(这些行是a执行某项操作的指令,文件本身是FIFO指令队列)。这个文件很小,而且大多数时候都是空的。A上有一些应用程序会将行附加到此文件

机器B到N只写这个文件,但它是不可预见的,所以访问冲突很可能经常发生

机器A每秒检查一次该文件,在执行上述指令的同时逐行删除所有当前存在的行(FIFO)。当然,这里存在很高的访问冲突可能性(因为客户端碰巧当前附加到文件中),但这是可以忽略的,因为预期的操作可以简单地中止(因为无论如何每秒都会重试,并且时间并不那么关键)


我遇到的主要问题是客户端机器。当一个客户机(或另一个客户机)实际操作文件时,如何确保仍然可以安全地将其附加到上的文件?我应该遵循A的策略,每秒钟都尝试一次,直到成功,还是有专门的I/O设置来实现这些目的?

共享单个文件会使错误检测变得不可能-如果远程客户端在锁定文件时崩溃,并且只完成了部分写入,会发生什么

如果不使用锁定,还必须担心同步更新会导致锁定和损坏。而且跨网络锁定文件可能会产生极大的问题

解决这一问题的最简单方法是,不需要对同一文件进行文件锁定和同步更新,因为同一文件系统中的文件重命名或移动是原子的

一种方法是:

  • 将扫描过程更改为按创建日期排序,扫描目录中的所有文件
  • 远程客户端在扫描程序正在扫描的目录所在的共享文件系统中的工作/临时目录中创建新文件。每个文件的命名模式应确保名称唯一
  • 一旦远程客户端成功写入整个文件,远程客户端进程将使用Windows上的调用或POSIX系统上的
    rename()
    ,重命名/移动到扫描的目录中。请注意,所使用的调用必须是原子操作,
    RenameFile()
    rename()
    都被记录为原子操作。(如果
    RenameFile()
    不允许将文件移动到另一个目录,请让远程客户端以“ASDF.ignore”或“ASDF.inwork”等文件名启动,然后使用
    RenameFile()
    删除扩展名,并让扫描过程忽略具有此扩展名的文件。)

  • 好吧,我直截了当——这是一个可怕的设计。它不遗余力地为腐败和种族状况创造机会。为什么不做一些简单的事情,例如1)远程计算机创建文件,每个文件的名称保证在与监视目录相同的文件系统上的临时目录中是唯一的2)然后远程计算机自动将每个文件移动到监视目录中3)监视进程根据创建的时间戳对文件进行排序,并在处理完每个文件后删除文件一个。@AndrewHenle,谢谢你的意见;我可能会按照建议的方式去做。(只是我觉得“一些简单的东西,例如”在这里不适用,因为它显然更详细;)-如果你费心把你的建议变成一个答案,而没有提供更合适或可行的建议,我很乐意接受它作为答案。@Andrewenle,为什么是临时目录而不是所有客户端共用的专用目录?您需要某种原子信号来告诉扫描过程“可以读取此文件”。最简单的方法是将文件重命名/移动到另一个目录,因为如果在同一个文件系统中执行这些操作,则这些操作是原子的。您需要该信号,因为扫描过程无法在没有该信号的情况下知道文件是否已完成-可能存在导致仅写入部分文件的错误。它只是一个临时目录,因为它与正在扫描的目录不同-文件将暂时位于该目录中。