关于RenameTo的帖子很多,但不幸的是,这似乎都不是我的问题或回答:'(
我的问题是:我将文件交给我的编,然后将其加密,计算加密文件的哈希值,并使用该哈希值重命名此加密文件。 为此,我首先创建一个名为“ 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.");
}
有时它运行良好,有时我收到“无法重命名文件”的信息。每次都正确创建了tmp文件,因此似乎确实来自renameTo。 另外,我现在已经运行了很多测试,并且它可能会失败或无法使用相同的文件输入(哦,除了加密的文件即使对于相同的输入文件也不会相同,因为密钥是随机的。) .so是的,RenameTo的输入不一样,但是我的意思不是它不是“找不到文件”问题,也不是程序另一部分的问题。
例如,我可以运行程序几次,每次给它一个相同的文件,并且两次第一次失败,第三次很好。或者我可以运行10次,第一次运行9次,最后一次失败。由于失败似乎是随机的,所以我不明白在这里行不通的原因。
我已经读到我可以改用Files.move(),但是对我来说使用RenameTo()似乎更“合乎逻辑”,我想了解这里出了什么问题。另外,Files.move()使用路径,我只希望它在我的项目目录中完成,因此文件名对我来说足够了。
答案 0 :(得分:1)
假设您的新文件名是Base64编码的哈希值,我很确定rename
在新文件名包含/
的情况下会失败。尝试将文件重命名为"abc/def"
时,renameTo
会将abc
部分解释为目录。由于该目录不存在,renameTo
将失败(它不会隐式创建它)。