从目录移动文件而忽略当前打开的文件

时间:2015-03-20 15:27:07

标签: java

我有一个java程序,除其他外,它写入一个带时间戳(SimpleDateFormat(“yyyyMMdd_HHmm”))日志文件。每次运行程序时,它都会将当前文件夹中的所有日志文件移动到另一个文件夹,同时写入新的日志文件。

我的(次要)问题是,除了旧的日志文件之外,它还会尝试移动我当前正在写入的日志文件,该文件在异常中被捕获,然后继续执行该程序的其余部分。这不会影响程序的职责,因为它会跳过此尝试,但是这个异常确实显示在日志文件中,这实际上不是人们想要的。

有没有办法复制一种类型的文件,同时忽略当前正在写入的文件?

代码:

try {

...

    Path logDir = FileSystems.getDefault().getPath( logTrim );
    String tempLogDir = logTrim + "\\" + logDirName1 + "\\" + logDirName2 + "\\";
    DirectoryStream<Path> logStream = Files.newDirectoryStream( logDir, "lol*log" );
    for (Path path : logStream) {
        Path logDir2 = FileSystems.getDefault().getPath( tempLogDir + "\\" + path.getFileName().toString() );
        Files.move(path, logDir2, StandardCopyOption.REPLACE_EXISTING);
        logger.log(Level.INFO, path.getFileName() + " moved to " + logDirName1 + "\n");
    }
    logStream.close();
}

catch (Exception e) {
    ...
}

我不喜欢的错误:

java.nio.file.FileSystemException: \\..\..\lol20150320_1522.log -> \\..\..\lol20150320_1522.log: The process cannot access the file because it is being used by another process.

非常感谢所有人

1 个答案:

答案 0 :(得分:0)

如果我说得对,一个解决方案是重命名您正在编写的日志文件,并检查您正在移动的文件的名称。另一种选择是检查文件名中的时间信息(如果它是旧的日志文件)。最后但并非最不重要的一点是,在你的循环中没有任何异常处理的情况下使用catch块。