多台电脑可以同时追加到Windows文件共享上的文件?

我试图从我的Windows机器networking上logging某些信息; 我已经设置他们定期收集这个信息,然后我想要在一个networking驱动器上的单个CSV文件。 我正在使用VBS来收集这些数据,在附加模式下使用OpenTextFile进行写入。 这将允许多台计算机同时附加一行到这个文件? 或者还有另一种方法来做到这一点(除了为每个设备存储一个单独的文件)。

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

Windows能够通过诸如字节范围locking之类的机制来共享对文件的并发访问,由此进程仅locking文件的特定区域等等。但是应用程序必须被适当地写入以利用这个。 完全可以通过locking整个文件的方式编写应用程序,而不仅仅是一个区域。 你甚至可以locking一个文件,使另一个进程甚至不能读取它。

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

SMB使用oplock (机会锁)和租赁来pipe理对文件的并发访问。 oplocks和租赁的types如下:

OPLOCKS

  • 级别1,独占访问权限此locking允许客户端打开文件以进行独占访问。 客户端可以执行预读缓冲和读取或写入caching。
  • 级别2,共享访问此锁允许多个同时读取文件而不需要写入者。 客户端可以执行预读缓冲并读取文件数据和属性的caching。 写入文件将导致锁的持有者被通知锁被破坏。
  • 批处理,独占访问此锁从处理批处理(.bat)文件时使用的locking中取得名称,该文件被打开和closures以处理文件中的每一行。 即使应用程序已经(可能暂时)closures了文件,客户端也可能在服务器上保持打开的文件。 该锁支持读取,写入和处理caching。
  • filter,独占访问此锁为应用程序和文件系统filter提供了在其他客户端尝试访问同一文件时放弃locking的机制,但与第2级locking不同,该文件无法打开以进行删除访问,而另一个客户端将不会收到共享违规。 该锁支持读取和写入caching。

租赁

  • 读取(R),共享访问允许同时读取多个文件,而不需要编写者。 此租约允许客户端执行预读缓冲和读取caching。
  • Read-Handle(RH),共享访问权限这与Level 2 oplock类似,允许客户机在服务器上保持文件打开状态,即使客户机上的访问器已closures文件。 (cachingpipe理器将懒惰地刷新未写入的数据,并根据内存的可用性清除未修改的caching页面。)这比级别2的oplock更好,因为在打开和closures文件句柄之间不需要中断租约。 (在这方面,它提供了与批处理oplock类似的语义。)这种types的租约对于重复打开和closures的文件特别有用,因为当文件closures时caching不会失效,而当文件再次打开时会重新填充,为复杂的I / O密集型应用程序提供了巨大的性能改进。
  • 读写(RW),独占访问此租约允许客户端打开文件以进行独占访问。 此锁允许客户端执行预读缓冲和读取或写入caching。
  • 读写处理(RWH),独占访问此锁允许客户端打开文件以进行独占访问。 这个租约支持读取,写入和处理caching(类似于Read-Handle租约)。

Windows Internals第6版,Mark Russinovich等人

这些模式都不会给你所寻求的共享写入权限。

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

不可以。一旦文件被打开写入,它就被locking了。 其他尝试在locking时写入将导致“访问被拒绝”。

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

处理这个问题的另一种方法可能是让每台机器在文件写入和释放之后对文件进行独占locking,并且每台机器都用一个试图获得对文件的写入访问的循环进行编程,并且在接收到一个“拒绝访问”消息只是重试,直到文件可用。 此人的需要是将短的日志消息附加到公用文件。 因此每台机器只能简单地locking文件。 获得独占写入locking的循环将很快获得写入访问权限。 如果每个进程都以附加模式写入,我相信这应该提供所需的function,每台机器根据需要添加到日志文件中。