我们可以重命名文件说test.txt来test1.txt?
如果test1.txt存在,它会重命名吗?
如何将其重命名为现有的test1.txt文件,以便将test.txt的新内容添加到其中以供以后使用?
在POSIX系统上,rename(2)提供原子重命名操作,包括覆盖目标文件(如果存在)以及权限是否允许.
有没有办法在Windows上获得相同的语义?我知道Vista和Server 2008上的MoveFileTransacted(),但我需要它来支持Win2k及更高版本.
这里的关键词是原子 ......解决方案不能以任何方式使操作失败,使操作处于不一致状态.
我见过很多人说在win32上这是不可能的,但我问你,是不是真的?
如果可能,请提供可靠的引用.
我正在尝试在Windows上使用Java 正确实现"写临时文件并重命名" .
如何在Java中以原子方式重命名文件,即使dest文件已存在?建议重命名文件是"原子操作"(无论"原子"实际上是什么意思). /sf/answers/1439967791/建议编写tmp文件并重命名是跨平台的,并确保最终文件不存在或可由其他进程处理.
所以我试着实际实现这种方法.以下是我的尝试摘要.对于实际问题 - 跳到底部.
我试着写和重命名文件的各种方法(content和charset是String和Charset分别对应).
使用java.nio.file.Files:
Files.copy(new ByteArrayInputStream(content.getBytes(charset)), tmpFile);
Files.move(tmpFile, finalFile, StandardCopyOption.ATOMIC_MOVE);
Run Code Online (Sandbox Code Playgroud)
使用番石榴(14)和java.io.File:
com.google.common.io.Files.write(content, tmpFile, charset);
tmpFile.renameTo(finalFile);
Run Code Online (Sandbox Code Playgroud)
或者甚至更模糊的方法:
try (OutputStream os = new FileOutputStream(tmpFile);
Writer writer = new OutputStreamWriter(os, charset)) {
writer.write(content);
}
Runtime.getRuntime().exec(
new String[] { "cmd.exe", "/C", "move " + tmpFile + " " + finalFile }).waitFor();
Run Code Online (Sandbox Code Playgroud)
现在假设另一个线程(线程因为我在测试中,在现实生活中它可能是另一个进程)正在执行以下版本的代码之一:
具有共同功能:
void waitUntilExists() throws InterruptedException {
while (!java.nio.file.Files.exists(finalFile)) { …Run Code Online (Sandbox Code Playgroud)