【问题标题】:Lock a file and delete it without first releasing the lock锁定文件并将其删除而不首先释放锁定
【发布时间】:2010-12-03 22:42:35
【问题描述】:

我想从一个文件中读取然后删除它,同时阻止其他进程访问它。这如何实现?

FileLock 不起作用,因为您必须先释放锁并关闭通道,然后才能调用 File.delete()。我担心的是,在释放锁定后,另一个进程可能会锁定它并在文件被删除之前开始读取。

我正在使用 Java 5,目前无法升级到 6。

【问题讨论】:

  • 您描述的问题只发生在Windows上。是那个平台吗?
  • 我也能在 Mac OS X 上重现这个问题。
  • @EJP - 你可能读得太字面意思了。问题不在于您“必须在调用 File.delete() 之前释放锁”。您可以在释放锁之前调用 File.delete(),但是,删除将不起作用。代码将执行,但方法将返回 false 并静默失败。
  • 如果它不起作用,它就不起作用。我不知道你想在这里澄清什么。

标签: java file-io


【解决方案1】:

我不知道这是否可能,但一个简单的解决方案是使用操作系统用户和权限来确保只有您的进程可以读取文件。

另一种方法是将文件重命名为随机生成的字符串,然后锁定、读取、解锁,然后删除重命名的文件。理论上,另一个程序可以猜测文件名并在文件被解锁之后但在文件被删除之前读取文件。但实际上你可能会没事的。

【讨论】:

  • 我认为这种方法会奏效。我在其他线程中看到 cmets 表明,如果源和目标位于同一目录中(更具体地说,当它们位于同一文件系统卷中时),重命名是大多数 JVM 上的原子进程。
  • 旁注:java.nio.file.StandardCopyOption.ATOMIC_MOVE 将确保它是原子的。
【解决方案2】:

您能否将文件移动到备用位置(其他潜在进程无法找到该位置),然后在那里进行处理?如果没有,在释放锁之前清除文件中的数据怎么样?

【讨论】:

  • 我有同样的问题,我可以重命名文件并移动到其他地方但仍然没有运气删除它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多