AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 510431
Accepted
askvictor
askvictor
Asked: 2013-05-24 15:37:07 +0800 CST2013-05-24 15:37:07 +0800 CST 2013-05-24 15:37:07 +0800 CST

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

  • 772

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

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

logging
  • 3 3 个回答
  • 10836 Views

3 个回答

  • Voted
  1. Best Answer
    Ryan Ries
    2013-05-24T18:45:09+08:002013-05-24T18:45:09+08:00

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

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

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

    机会锁

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

    租约

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

    Windows Internals 第 6 版,Mark Russinovich 等。

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

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

    • 6
  2. MDMarra
    2013-05-24T15:42:12+08:002013-05-24T15:42:12+08:00

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

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

    • 3
  3. RagtimePlayedHere
    2014-08-18T12:13:48+08:002014-08-18T12:13:48+08:00

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

    • 1

相关问题

  • IIS 6 - 仅记录某些目录

  • 什么是好的日志查看器,例如 apache、postfix、syslog?

  • 如何提供可搜索的 IRC 日志?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

  • Tomcat 6 HTTP 日志滚动和清除

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve