RenameTo 似乎随机失败

RenameTo seems to fail randomly

有很多关于 RenameTo 的 post,但不幸的是 none 似乎是我的问题或回答它:'(

我的问题是:我给了我的程序一个文件,然后它应该加密它,计算加密文件的哈希值,并用这个哈希值重命名这个加密文件。 为此,我首先创建名为 "tmp" 的加密文件,然后我计算他的名字(在下面的代码中调用 "myfile.setFileID()"),然后我使用 RenameTo 重命名它。

加密效果很好,散列函数也很好(毫无疑问,我在尝试实现之前都使用了一段时间)。事实上,一切正常......除了有时 RenameTo 失败。我不知道为什么。

这是我使用 RenameTo 的代码部分:

            //encrypt file:
            File tmpEncryptedFile = Crypt.encrypt(originalFile, aesKey);

            //set File ID and rename file: 
            myfile.setFileID(tmpEncryptedFile);
            File encryptedFile = new File(myfile.getFileID());
            if(!tmpEncryptedFile.renameTo(encryptedFile)) {
                System.err.println("unable to rename file. Upload failed. Please try again.");
            }

有时效果很好,有时我得到了"unable to rename file"。每次都会正确创建 tmp 文件,所以看起来真的来自 renameTo。 另外,我现在 运行 进行了很多测试,它可能会失败或使用相同的文件输入(哦,除了即使对于相同的输入文件,加密文件也不会相同,因为密钥是随机的...所以是的,RenameTo 的输入不一样,但我的意思是这不是 "file not found" 问题或我程序另一部分的问题)。

例如,我可以运行程序多次,每次都给它相同的文件,两次第一次失败,第三次运行良好。或者我可以 运行 10 次,第一次 9 次运行良好,最后一次失败。由于失败似乎是随机的,我不明白什么在这里不起作用。

我读到我可以改用 Files.move(),但对我来说似乎更 "logical" 使用 RenameTo(),我想了解这里有什么问题。另外,Files.move() 使用路径,我只想在我的项目目录中完成它,这样文件名对我来说就足够了。

假设您的新文件名是一个 Base64 编码的哈希值,我很确定 rename 在新文件名包含 / 的情况下会失败。尝试将文件重命名为 "abc/def" 时,renameTo 会将 abc 部分解释为目录。由于此目录不存在 renameTo 将失败(它不会隐式创建它)。