我目前正在尝试为我正在撰写的应用实施更新程序。 该过程目前看起来如下:
此过程中有问题的部分是新版本的文件副本到应用程序的基础上,因为应用程序的基础目录中的某些文件可能由于某种原因而被锁定(即用户打开文件在这个目录)
因此,可能会发生某些文件被复制而且有些文件被丢弃 - 留下不一致的状态,可能还不是可执行的应用程序。
我为防止这种情况所做的是在复制新文件之前检查应用程序中是否存在任何锁定文件。我为此目的编写了一个util方法:
public static boolean isLocked(File pFile){
if (pFile == null || !pFile.exists()){
return false;
}
if (!pFile.canWrite()) return true;
if (!pFile.renameTo(pFile)) return true;
try {
final FileChannel tFileChannel = FileChannel.open(pFile.toPath(), StandardOpenOption.WRITE);
final FileLock tLock = tFileChannel.tryLock();
try {
if (tLock == null){
return true;
} else {
tLock.release();
}
} finally {
tFileChannel.close();
}
} catch (final IOException | OverlappingFileLockException ex) {
return true;
}
return false;
}
但我仍然认为这个过程非常容易出错,因为我不知道isLocked()
方法在所有情况下都能提供可靠的结果。
即使如此,锁定状态仅在调用方法时有效 - >通话结束后,该文件可能会被锁定(例如,通过反病毒扫描程序)
所以我的问题是:是否有更可靠的方法来复制一组文件?也许在某种可回滚的文件事务中?
答案 0 :(得分:2)
也许我忽视了某些事情 - 但是并不是确保你的更新程序在开始工作之前锁定所有文件的唯一正确答案?
它试图锁定所有文件;并且只有当它拥有"所有相关文件,它开始工作?!