当前位置:  开发笔记 > 编程语言 > 正文

使用Commons IO复制时锁定文件

如何解决《使用CommonsIO复制时锁定文件》经验,为你挑选了1个好方法。

我正在使用Apache Commons IO:

     FileUtils.copyFileToDirectory(srcFile, destDir)

如何在复制期间使Windows锁定目标文件?如果我使用Windows,Windows会正确锁定文件:

      Runtime.getRuntime().exec(
      "cmd /c copy /Y \"" + srcFile.getCanonicalPath() + "\" \""
          + destDir.getCanonicalPath() + "\"").waitFor();

注意:争用不是本地程序,而是外部程序.该文件正被复制到远程系统.远程系统在完成复制之前处理文件.由于系统是Windows,因此普通副本会锁定文件并阻止外部程序访问.



1> Bill Michell..:

java.nio.channels.FileChannel将允许您使用基础文件系统的本机方法获取文件上的FileLock,假设支持此类功能.

这个锁在机器上的进程中运行,甚至是非Java的进程.(实际上,锁代表特定的JVM实例,因此不适合管理进程中多个线程或同一JVM中的多个进程之间的争用).

这里有很多注意事项,但如果您正在使用Windows,则值得研究.

来自javadoc:

此文件锁定API旨在直接映射到底层操作系统的本机锁定工具.因此,无论编写这些程序的语言如何,所有可以访问该文件的程序都可以看到文件中保存的锁.

锁实际上是否阻止另一个程序访问锁定区域的内容是系统相关的,因此未指定.某些系统的本机文件锁定功能仅仅是建议性的,这意味着程序必须协作地观察已知的锁定协议以保证数据的完整性.在其他系统上,本机文件锁是必需的,这意味着如果一个程序锁定文件的某个区域,则实际上阻止其他程序以违反该锁的方式访问该区域.在其他系统上,可以基于每个文件配置本机文件锁是建议性的还是必需的.为了确保跨平台的一致和正确行为,强烈建议使用此API提供的锁,就像它们是建议锁一样.

在某些系统上,获取文件区域的强制锁定会阻止该区域映射到内存中,反之亦然.应该为这种组合准备组合锁定和映射的程序失败.

在某些系统上,关闭通道会释放由基础文件上的Java虚拟机保留的所有锁,无论锁是通过该通道还是通过在同一文件上打开的另一个通道获取的.强烈建议在程序中使用唯一通道获取任何给定文件上的所有锁.

某些网络文件系统允许文件锁定仅在锁定区域与页面对齐并且是底层硬件页面大小的整数倍时与内存映射文件一起使用.某些网络文件系统不会对延伸超过某个位置的区域(通常为230或231)实施文件锁定.通常,在锁定驻留在网络文件系统上的文件时应特别小心.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有