UNIX文件锁定非常简单:操作系统假定您知道自己在做什么,然后就可以按照自己的意愿进行操作:
例如,如果您尝试删除另一个进程已打开的文件,则操作系统通常会允许您执行此操作。原始进程仍将保留其文件句柄,直到它终止-这时文件系统将安静地回收磁盘资源。不用大惊小怪,这就是我喜欢的方式。
Windows上的不同之处:如果我尝试删除另一个进程正在使用的文件,则会出现操作系统错误。在原始进程释放它之前,该文件不可触摸。在MS-DOS的单用户时代,当任何锁定过程可能都在包含文件的同一台计算机上的时候,那真是太棒了,但是在网络上却是一场噩梦:
考虑写入Windows文件服务器上的共享文件时进程挂起时会发生什么。在删除文件之前,我们必须找到计算机,并标识最初打开文件的那台计算机上的进程。只有这样,我们才能终止进程并删除不需要的文件。
真讨厌!
有没有办法使它更好?我想要的是Windows上的文件锁定表现得像UNIX中的文件锁定一样。我想让操作系统让我做我想做的事情,因为我掌管并且知道我在做什么…
…所以可以做到吗?
根据MSDN,您可以将CreateFile()第三个参数(dwSharedMode)共享模式标志指定为FILE_SHARE_DELETE:
在文件或设备上启用后续打开操作以请求删除访问。
否则,如果其他进程请求删除访问,则它们将无法打开文件或设备。
如果未指定此标志,但是已打开文件或设备以进行删除访问,则该功能将失败。
注意删除访问权限允许删除和重命名操作。
http://msdn.microsoft.com/zh-CN/library/aa363858(VS.85).aspx
因此,如果您可以控制自己的应用程序,则可以使用此标志。
问题内容: 我有几个线程(其中一些由进程X产生,其他由进程Y 等产生 ),并且每个线程都需要写入文件。但是,如果开始写第一,那么,当开始写作,它需要等待到 释放文件 ,以便它可以读取写在该内容。换句话说,每个线程都会有一个方法,如下所示: 我的问题是:如何完成以上代码?我正在研究该类,但是它在Javadoc中说: “文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。
问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java
问题内容: 在Bash中,我试图使函数getLock与不同的锁名一起使用。 但是羊群说 如何仅锁定文件并在需要时释放它,而不必在集群中执行命令? 它的用法如下: 问题答案: 锁定文件: 释放锁: 您也可以按照羊群手册页中的描述进行操作: …在这种情况下,文件退出时文件会自动关闭。(在这里也可以通过使用而不是来使用子外壳,但这应该是一个有意的决定- 因为子外壳会降低性能,并且会影响范围变量的修改和其
问题内容: 我在使用Java在Windows中删除文件时遇到一些问题。由于某种原因,java会锁定我的文件,但我不知道为什么。这是我的代码: file.delete()以及在资源管理器中手动尝试拒绝删除该文件,因为它仍在使用中。尽管在Linux中一切似乎都很好。 我在某处缺少close()吗?我可以确认首先使文件成为关闭文件的方法,因为我可以在使用file.delete()运行上述代码之前删除文件
问题内容: 我有一个新来的人(隔壁的少年)写一些php代码来跟踪我的网站上的一些用法。我不熟悉php,所以我想问一下有关并发文件访问的问题。 我的本机应用程序(在Windows上)偶尔会通过点击包含我的php脚本的URL将一些数据记录到我的站点。本机应用程序不检查返回的数据。 这是一个人流量低的站点,并且数据并不重要。但是,如果两个用户发生冲突并且脚本的两个实例各自尝试向该文件添加一行,会发生什么
进程锁 这里的进程锁与线程锁、互斥量、读写锁和自旋锁不同,它是通过记录一个PID文件,避免两个进程同时运行的文件锁。 进程锁的作用之一就是可以协调进程的运行,例如crontab使用进程锁解决冲突提到,使用crontab限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题。后面提到的项目实例Run也有类似的问题,通过进程锁可以解决进程间同步