首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在写入文件时等待

如何在写入文件时等待
EN

Stack Overflow用户
提问于 2013-07-19 17:57:49
回答 2查看 399关注 0票数 0

我有很多写文件的进程(任何文件都可以写一次)。它们打开、写入和关闭文件。此外,我有许多进程,这是读取文件。文件大小可能各不相同。需要这样:当某个进程试图读取此时正在写入的文件时,我需要在写入后关闭文件时读取全部内容。我需要锁定写入,并等待读取时解锁。重要:如果文件读取文件,但不能这样做,它就会自己写入文件。1.尝试读取文件2.如果文件不存在,则写入文件

因此,对于异步模式,可能有超过1个进程因为无法读取文件而想要写入文件。我需要锁定文件写入,所有的读者都应该等待

EN

回答 2

Stack Overflow用户

发布于 2013-07-19 18:24:46

文件锁定是特定于操作系统的事情。

类Unix系统

类Unix系统通常支持flock()fcntl()lockf()系统调用。但是,除了lockf建议锁之外,它不是Posix标准的一部分,因此您需要查阅特定于操作系统的文档。

Linux的文档在这里:

  • http://linux.die.net/man/3/lockf
  • http://linux.die.net/man/2/fcntl
  • http://linux.die.net/man/2/flock

请注意,fcntl()不仅仅是锁定,还可以做很多事情。

还要注意,在大多数情况下,在类unix系统上锁定是建议的--即合作努力。双方都必须参与,简单地忽略锁是一种可能性。强制锁定是可能的,但在典型范例中不会使用。

Windows

在windows中,强制文件锁(与CreateFile的共享模式)和范围锁LockFileEx是正常的,建议锁是不可用的,尽管它们可以被模拟(通常在0xffffffff0xffffffffffffffff上使用单字节范围锁-锁定的部分不必实际存在,因此这并不意味着文件有那么大)。

Alternatives

对于您所描述的场景,另一种方法是简单地创建具有不同名称的文件,然后在完成后重命名它。

例如,如果文件名为"data-20130719-112258-99823.csv“,而不是创建一个名为"tmpdata-20130719-112258-99823.csv.tmp”的文件,那么当它被完全写入时,将其重命名。

票数 2
EN

Stack Overflow用户

发布于 2013-07-19 18:17:32

处理此问题的标准方法是写入临时文件名,然后在写入完成后重命名该文件。

等待文件的其他进程需要监视实际文件的存在(使用文件系统监视器或类似机制)。当文件“出现”时,写入已经完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17743251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档