【问题标题】:Modify Java File attributes without changing disk-file修改 Java 文件属性而不更改磁盘文件
【发布时间】:2013-12-11 00:54:49
【问题描述】:

为了确保 java.io.File 在处理过程中不被修改/删除,我想在与原始文件(例如系统临时目录)不同的目录中创建一个临时文件

  • 用户无法访问
  • 但保留原始文件的信息(目录、名称、...)

我需要原始文件的信息,因为文件信息有很多访问,例如文件夹结构、文件名和文件扩展名。使用临时文件会破坏这些信息。

很遗憾,不能只设置文件名/目录,因为这会重命名/移动文件。

替代方法:也可以同时处理这两个文件,从源文件中获取信息并从临时文件中读取内容,但这似乎不是最佳方法。

有更好的方法吗?

最好的问候 马丁

【问题讨论】:

  • 锁定文件不起作用的任何原因?

标签: java file temporary-files


【解决方案1】:

听起来您想要做的只是防止在读取文件时对其进行任何修改。这通常是通过锁定文件来完成的,这样只有您的进程才能访问它。举个例子(使用 java.nio 中的FileLock

try{
    File file = new File("randomfile.txt");
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
    FileLock lock = channel.lock();//Obtain a lock on the file
    try{

        //Do your things

    }
    finally{
        lock.release();//Release the lock on the file
        channel.close();
    }

} 
catch (IOException e) {
   e.printStackTrace();
}

【讨论】:

  • 你是对的,谢谢!但是,行 FileChannel channel = new RandomAccessFile(file, "r").getChannel();需要写访问权限,应更改为 FileChannel channel = new RandomAccessFile(file, "rw").getChannel();否则无法获取锁。
  • @Mash 确实如此。这将获得一个需要写访问权限的完整锁。有一种方法可以获取共享锁,它只需要读取访问权限,但我不知道它是什么。
【解决方案2】:

我建议你使用java.io.File.createTempFile(String, String, File),也使用java.io.File.deleteOnExit();该文件必须可供用户访问 - 否则用户无法写入(QED)。也就是说,尝试这样的事情 -

try {
  File directory = new File("/tmp"); // or C:/temp ?
  File f = File.createTempFile("base-temp", ".tmp", directory); // create a new
              // temp file... with a prefix, suffix and in a tmp folder...
  f.deleteOnExit(); // Remove it when we exit (you can still explicitly delete when you're done). 
} catch (IOException e) {
  e.printStackTrace();
}

【讨论】:

  • 只处理这个临时文件,我会丢失原始文件中的信息。
猜你喜欢
  • 2021-11-02
  • 2010-11-06
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多