多台计算机可以同时将文件附加到 Windows 文件共享上的文件吗?

多台计算机可以同时将文件附加到 Windows 文件共享上的文件吗?

我正在尝试从我的 Windows 计算机网络中记录某些信息;我已将它们设置为定期收集此信息,然后我希望将其保存在网络驱动器上的单个 CSV 文件中。我正在使用 VBS 来收集这些数据,使用追加模式的 OpenTextFile 进行写入。这是否允许多台计算机同时将一行追加到此文件?或者还有其他方法可以做到这一点(除了为每个设备存储单独的文件之外)。

我不关心顺序(我从每个设备收集时间戳)。

答案1

Windows 能够通过字节范围锁定等机制共享对文件的并发访问,即进程仅锁定文件的特定区域等。但应用程序必须以适当的方式编写才能利用此功能。完全可以以锁定整个文件(而不仅仅是文件的一部分)的方式编写应用程序。您甚至可以锁定文件,以便其他进程甚至无法读取它。

然而,当您谈论访问网络文件共享上的文件时,事情就变得复杂了。现在我们通过 SMB 网络协议访问文件。

SMB 用途机会锁(机会锁)和租约管理对文件的并发访问。 oplocks 和 leases 的类型如下:

机会锁

  • 1 级,专属访问此锁允许客户端打开文件进行独占访问。客户端可以执行预读缓冲和读取或写入缓存。
  • 第 2 级,共享访问此锁允许多个文件同时读取,但不允许写入。客户端可以执行文件数据和属性的预读缓冲和读取缓存。对文件的写入将导致锁的持有者收到锁已被破坏的通知。
  • 批量、独占访问此锁的名称源自处理批处理 (.bat) 文件时使用的锁定,批处理文件会打开和关闭以处理文件中的每一行。即使应用程序已(可能是暂时)关闭了文件,客户端也可能会在服务器上保持文件打开。此锁支持读取、写入和句柄缓存。
  • 过滤,独家访问此锁为应用程序和文件系统过滤器提供了一种机制,当其他客户端尝试访问同一文件时,它们可以放弃锁定,但与 2 级锁不同,该文件不能被打开进行删除访问,并且其他客户端不会收到共享冲突。此锁支持读写缓存。

租赁

  • 读取 (R)、共享访问允许多个用户同时读取一个文件,但不允许任何用户写入。此租约允许客户端执行预读缓冲和读取缓存。
  • 读句柄 (RH),共享访问这类似于 2 级 oplock,但还有一个额外的好处,即即使客户端上的访问者已关闭文件,客户端仍可保持文件在服务器上打开。(缓存管理器将根据内存可用性缓慢地刷新未写入的数据并清除未修改的缓存页面。)这优于 2 级 oplock,因为在文件句柄的打开和关闭之间不需要中断租约。(在这方面,它提供了类似于批处理 oplock 的语义。)这种类型的租约对于反复打开和关闭的文件特别有用,因为文件关闭时缓存不会失效,文件再次打开时缓存不会重新填充,从而为复杂的 I/O 密集型应用程序提供巨大的性能提升。
  • 读写 (RW),独占访问此租约允许客户端打开文件进行独占访问。此锁允许客户端执行预读缓冲和读取或写入缓存。
  • 读写句柄 (RWH),独占访问此锁允许客户端打开文件进行独占访问。此租约支持读取、写入和句柄缓存(类似于 Read-Handle 租约)。

Windows Internals 第 6 版,Mark Russinovich 等人

这些模式都不会给您提供您所寻求的共享写访问权限。

改变你的策略。就像 MDMarra 所说的那样,Windows 事件日志是更好的选择。另一个想法是让所有客户端在文件共享中写入自己的文件,然后让服务器进程收集所有文件并聚合它们。你在问题中提到你正在编写代码,因此你可以改变此应用程序的工作方式。我建议去 StackOverflow 询问他们通过网络实现对单个文件的共享写访问的最佳方法。

答案2

不可以。一旦文件被打开进行写入,它就会被锁定。在锁定状态下尝试写入将导致“访问被拒绝”。

您应该考虑将这些事件写入本地事件日志,然后使用事件日志订阅将所有这些日志拉入中央源。从那里,您可以将其导出为您想要的任何格式。

答案3

处理此问题的另一种方法可能是让每台机器在写入文件时对文件拥有独占锁,然后立即释放文件,并且还为每台机器编写一个循环,尝试获取对文件的写访问权限,并且在收到“访问被拒绝”消息时重试,直到文件可用。这个人的需求是将短日志消息附加到公共文件中。因此,每台机器只会短暂地锁定文件。获取独占写锁的循环将快速获得写访问权限。假设每个进程都以附加模式写入,我相信这应该提供所需的功能,即每台机器根据需要将内容添加到日志文件中。

相关内容