问题标签 [file-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
8658 浏览

.net - File.Copy 完成后锁定源文件

我们正在尝试将文件从服务器复制到 .NET 2.0 应用程序 (C#) 中的本地计算机,但一直不必要地锁定源文件。我们怀疑是文件服务器上配置的东西导致了这种行为,但不确定是什么......你能帮忙吗?

文件复制操作后,文件服务器 (Windows 2K3 R2) 报告源文件正被读取锁定,即使服务器上的文件没有进一步操作。一旦应用程序退出,锁就会被释放。

即使使用下面看到的最基本的代码,我们也能够重现该行为:

锁定File.Copy()在行执行期间立即发生,并在该行完成后持续存在。在更复杂的应用程序中,当带有File.Copy()退出的例程(但应用程序仍在运行)时,锁仍然存在。

只有当整个应用程序完成时,锁才会被释放。

更改sourceFile为使用映射驱动器而不是 UNC 路径对行为没有影响。

当源文件位于另一台服务器上或位于本地时,不会发生此行为。

如果我们在后面加上下面一行File.Copy,锁会立即被释放:

这对我们来说听起来好像服务器上有什么东西导致了这种行为。我们在服务器上安装了 ShadowProtect 以及 McAfee 防病毒软件。除此之外,似乎在 Windows Server 及其组件之上没有安装其他任何东西。

我们也不确定为什么要求文件的读取权限可以解决问题。

如果您能回答这些问题,我们将不胜感激:

  1. 是什么导致文件锁持续存在?
  2. 为什么要求读取权限可以解决问题?
0 投票
3 回答
4560 浏览

java - 将文件写入磁盘时锁定文件

我有两个并行运行的独立线程 F1 和 F2(准确地说,是 java.util.concurrent.FutureTask 的两个实例)。

F1 做一些处理,然后将结果复制到一个 XML 文件中。然后,它重复这些步骤,直到它无事可做(创建了许多 XML 文件)。F2 在 F1 输出目录中查找,并获取一个文件,对其进行解析,并对其执行一些处理。

这非常有效,只是有时 F2 从文件中获取截断的 XML 数据。我的意思是不完整的 XML,其中不存在某些 XML 节点。问题是它并不总是可复制的,被截断的文件并不总是相同的。因此,我认为当 F1 正在磁盘上写入一个文件时,F2 正在尝试读取同一个文件。这就是为什么有时我会遇到这种错误。

我的问题:我想知道是否有某种机制可以锁定(甚至读取)文件 F1 当前正在写入,直到它完全完成将其写入磁盘,所以 F2 在文件解锁之前将无法读取它. 或者任何其他方式来解决我的问题都将受到欢迎!

F1 以这种方式写入文件:

F2 以这种方式读取文件:

0 投票
8 回答
2517 浏览

delphi - 日志文件监视器

是否可以在另一个应用程序更新文件时打开文本文件并读取内容,这样不会导致锁定冲突?

我需要监视一个应用程序的日志文件,每次发生事件时该文件都会由另一个应用程序更新。

在尝试读取文件之前,我会检查文件是否正在使用中,但这似乎并非在所有情况下都有效。

谢谢,彼得

0 投票
0 回答
247 浏览

.net - 额外进程文件锁

我有一个 .NET 系统,我需要在其中允许跨进程边界锁定和解锁文件。我打算使用的模型是这样的:

  1. 用户生成锁定令牌
  2. 使用令牌锁定文件并刷新令牌
  3. 根据需要在 #2 重复
  4. 使用通过释放令牌来解锁所有文件
  5. 如果使用在某个时间范围内无法刷新令牌,#4 会自动发生

每个步骤都可以从不同的过程中完成。

问题有两个:这是一个合理的模型吗?是否有任何现成的工具可以实现它?如果这不能直接在操作系统中完成,我正在考虑使用.files 等进行某种咨询锁定。

编辑:此模式获得非独占读锁,但其他模式可以获得独占写锁,但它们总是由获得它们的同一进程释放。

0 投票
20 回答
631355 浏览

c# - 有没有办法检查文件是否正在使用?

我正在用 C# 编写一个需要重复访问 1 个图像文件的程序。大多数情况下它可以工作,但如果我的计算机运行速度很快,它会在文件保存回文件系统之前尝试访问文件并抛出错误:

“文件正在被另一个进程使用”

我想找到解决这个问题的方法,但我所有的谷歌搜索都只通过使用异常处理产生了创建检查。这违反了我的宗教信仰,所以我想知道是否有人有更好的方法?

0 投票
4 回答
3939 浏览

sqlite - Mac 网络上的 SQLite 中的“数据库已锁定”错误

我使用 SQLite(实际上是 PySQLite)创建了一个简单的数据库。当我从本地机器(即windows机器驱动器上的程序和数据库文件)查询或写入数据库时​​,它工作正常。但是,当我将数据库文件复制到我的网络驱动器(时间胶囊)时,Windows 机器虽然可以看到这些文件并且对驱动器具有完全的读/写访问权限,但甚至给我一个“SQL 错误:数据库已锁定”执行简单选择时!

从 Mac 上通过网络查询可以正常工作。

没有花哨的多访问——只有一台机器打开了数据库。似乎是一些奇怪的 Mac 网络问题。在 Python 程序或 SQLite3 命令行中发生。我正在使用 SQLite 3.6.14.2。

有人看到这个问题吗?有什么办法解决吗?真的不想使用 MYSQL,因为这是一个简单的单用户程序,但我想在多台机器上使用它。

谢谢。

0 投票
3 回答
25830 浏览

linux - 如何使用linuxflock命令来防止另一个root进程删除文件?

我想阻止我的一个根进程删除某个文件。所以我遇到了flock 命令,它似乎符合我的需要,但我没有得到它的语法。

如果我只表示一个共享锁,它就不起作用:

如果我添加一个超时参数,它仍然不起作用:

似乎是这样,它适合的flock [-sxun][-w #] fd#方式。(这个fd#参数是什么?)

所以,我尝试了:

使用flock -s -w5 "./file.xml" -c "tail -3 ./file.xml"并且它起作用了,执行了 ./file.xml 处的 tail 命令。

但我想知道,锁定是在命令后结束还是在命令执行结束后持续 5 秒?我的主要问题是,如何防止另一个 root 进程删除 linux 中的文件?

0 投票
1 回答
369 浏览

.net - “集会炼狱”会发生什么?

当一个 .NET 程序集被部署到 GAC 并且目标文件被锁定时,Windows 将它保存在我最能猜到的某种“程序集炼狱”中 - c:\windows\assembly\temp.

使用 Process Explorer 在搜索可疑 DLL 时可以很容易地看到这些:

流程浏览器搜索
(来源:alexangas.com

一旦我结束锁定文件的进程(在本例中为 OWSTIMER.EXE),它就会神奇地正确部署到 GAC。

我很好奇 Windows 在这里实际做了什么。它如何知道文件锁何时被释放?它在哪里保存锁定文件的记录?它会放弃吗?

0 投票
2 回答
1696 浏览

multithreading - 正确销毁命名的 System V 信号量

我正在使用命名的 System V 信号量来锁定我在 OSX 和 linux 上的所有应用程序中的文件。无论如何定义都不是最漂亮的 API。

它似乎有效,但我不太清楚在每个人都完成后如何正确销毁信号量。

一般逻辑是这样的:

创建:

[1] 线程或进程尝试使用 ftok() 为文件创建的 key_t 打开一个信号量集。Set 包含 2 个信号量。[2] 如果信号量集不存在,则使用 666 权限创建。[3] “锁定”(信号量之一)设置为释放状态(值 1)。[4] “引用计数”(同一集合中的另一个信号量)递增。

锁定/解锁:

要锁定 [5],线程将“Lock”信号量的值减 1(撤消),因此如果它已经为零,则等待。为了解锁 [6],线程将其加一,从而允许其他人锁定它。

销毁:

[7] 尝试减少“引用计数”信号量(使用 IPC_NOWAIT 标志)。[8] 检查其值为0,如果为[9],则销毁信号量集。

(还有一层基于线程本地存储的逻辑,使锁在一个线程内递归。)

问题是:

  • 如何同步步骤 [1] 和 [2]?(如果信号量集不存在,但是当我们计算星星时,它是由其他人创建的,所以现在创建也会失败)
  • 如何将步骤 [4] 与 [8] 同步,以便 [9] 不会过早杀死我?
  • 还有其他比赛条件吗?

PS:虽然 POSIX 信号量有更好的 API,但我认为我无法在此处描述的 sem_inlink() 行为中幸存下来:

调用 sem_open() 以重新创建或重新连接到信号量是指调用 sem_unlink() 后的新信号量。

所以我没有办法释放他们......

0 投票
1 回答
116 浏览

windows - 当其他资源正在使用文件时,防止访问复制文件

在我的应用程序中,我有一个 exe 文件,它将对目录中的视频文件进行一些转换,而且我使用可爱的 ftp 将目录中存在的文件传输到另一台服务器。

CUTE FTP 配置为每分钟运行一次。

当一个视频文件完成 25% 的工作时,CUTEFTP 将该文件传输到其他服务器。

有什么方法可以解决这个问题。