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

ask*_*tor 2 logging network-share vbscript

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

我不在乎订单(我从每个设备收集时间戳)。

Rya*_*ies 6

Windows 能够通过诸如字节范围锁之类的机制共享对文件的并发访问,从而进程只锁定文件的某个区域等。但是必须适当地编写应用程序才能利用这一点。完全有可能以锁定整个文件的方式编写应用程序,而不仅仅是其中的一个区域。你甚至可以锁定一个文件,这样另一个进程甚至无法读取它。

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

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

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

租赁

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

Windows Internals 第 6 版,Mark Russinovich 等。

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

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