文件未在Windows上删除和重命名但在Mac上正在使用

时间:2016-11-08 23:06:29

标签: windows macos

我在Mac上编写了代码。 我正在创建两个文件,让我们称之为file1和file2 对于file1,如果我在SQL中找到一个比存储在file1中的记录更大的记录,我将所有内容写入临时文件,删除file1并将临时文件重命名为file1。这适用于Windows和Mac。

对于file2,如果我在SQL中找到一个比存储在file2中的更大的时间戳值,我会做同样的过程。这在我的Mac环境中本地工作,但无法在Windows上删除和重命名该文件。

然而,当我第一次启动程序时,由于我的缓冲编写器总是写入临时文件然后重命名临时文件,因此第一次运行程序时,文件2的重命名和删除是有效的,这意味着文件2,而不是file1尚未存在。

因此,启动时,file2不存在。缓冲的写入器写入tempFile,如果存在则删除file2(在这种情况下不存在),并将tempFile重命名为file2。这有效。但是,后续记录新数据无法删除并重命名file2。但正如我所说,这适用于Mac但不适用于Windows。

删除和重命名file1的代码(适用于Windows和Mac):

private void recordMaxRecordIdFromHistory(String table, String maxRecord) {
    String line;
    try {
      File file1 = new File(file1);
      File tempFile = new File("tempFile.txt");

      FileWriter fw = new FileWriter(tempFile, false);
      BufferedWriter bw = new BufferedWriter(fw);

      if (!file1.exists()) {
        file1.createNewFile();
      }
      FileReader fr = new FileReader(file1);
      BufferedReader br = new BufferedReader(fr);

//writing to temp file
      if(){
        ....
      }
      else{
        ....
      }

      bw.close();
      br.close();
      if (file1.delete()) {
        logger.info("Successfully deleted the max ID file");
      } else {
        logger.error("Unable to delete the file maxID File");
      }
      if (tempFile.renameTo(file1)) {
        logger.info("Successfully renamed the tempFile to file1");
      } else {
        logger.error("Unable to rename the tempFile to file1");
      }

    } catch (Exception ex) {
      logger.error(ex.getMessage());
    }
  }

删除和重命名File2的代码(适用于Mac,仅适用于第一次在Windows上运行程序)

 private void recordLastModifiedDate(String table, Timestamp modifiedDate) {

    String line;

    try {
      File file2 = new File(file2);
      File tempFile2 = new File("tempFile2.txt");

      FileWriter fw = new FileWriter(tempFile2, false);
      BufferedWriter bw = new BufferedWriter(fw);

      if (!file2.exists()) {
        file2.createNewFile();
      }
      FileReader fr = new FileReader(file2);
      BufferedReader br = new BufferedReader(fr);

      //WRITING TO FILE HERE

      bw.close();
      br.close();

      if (file2.delete()) {
        logger.info("Successfully deleted the lastModified file");
      } else {
        logger.error("Unable to delete the lastModified file");
      }

      if (tempFile2.renameTo(file2)) {
        logger.info("Successfully renamed the tempFile to lastModified");
      } else {
        logger.error("Unable to rename the tempFile to lastModified");
      }

    } catch (Exception ex) {
      logger.error(ex.getMessage());
    }
  }

1 个答案:

答案 0 :(得分:1)

您没有关闭FileReader,而是关闭BufferedReader(作家也是如此)。

由于您未关闭FileReader/FileWriterfr.close()fw.close()),因此句柄保持有效。

这在类似Unix的系统(如MacOS-X)上不是问题,但在Windows中,如果程序上已经有一个打开的句柄(读取或写入),则无法删除文件(Windows locks 文件),因此错误。

请致电fr.close()fw.close(),您的代码将在Windows上运行。