创建更新程序

时间:2015-03-07 13:12:41

标签: java io

我目前正在尝试为我正在撰写的应用实施更新程序。 该过程目前看起来如下:

  • 将updater.jar从类路径(例如app.jar)解压缩到系统的临时目录
  • 打开一个套接字以侦听更新程序的终止请求
  • 启动updater.jar
  • 更新程序然后检查更新程序是否可用
  • 如果有更新,则更新程序会向应用程序发送终止请求(通过打开的套接字)
  • updater将新版本下载到系统临时目录
  • 更新程序将新版本中的所有文件复制到应用程序的基础目录(覆盖现有文件)

此过程中有问题的部分是新版本的文件副本到应用程序的基础上,因为应用程序的基础目录中的某些文件可能由于某种原因而被锁定(即用户打开文件在这个目录) 因此,可能会发生某些文件被复制而且有些文件被丢弃 - 留下不一致的状态,可能还不是可执行的应用程序。
我为防止这种情况所做的是在复制新文件之前检查应用程序中是否存在任何锁定文件。我为此目的编写了一个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()方法在所有情况下都能提供可靠的结果。
即使如此,锁定状态仅在调用方法时有效 - >通话结束后,该文件可能会被锁定(例如,通过反病毒扫描程序) 所以我的问题是:是否有更可靠的方法来复制一组文件?也许在某种可回滚的文件事务中?

1 个答案:

答案 0 :(得分:2)

也许我忽视了某些事情 - 但是并不是确保你的更新程序在开始工作之前锁定所有文件的唯一正确答案?

它试图锁定所有文件;并且只有当它拥有"所有相关文件,它开始工作?!