重命名似乎随机失败



有很多关于重命名的帖子,但不幸的是,这些似乎都不是我的问题或回答它:'(

我的问题是:我给我的 prog 一个文件,然后它应该加密它,计算加密文件的哈希,并用这个哈希重命名这个加密文件。 为此,我首先创建名为"tmp"的加密文件,然后计算他的名字(在下面的代码中调用"myfile.setFileID(("(,然后使用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 的输入不一样,但我的意思是这不是"找不到文件"的问题或我程序另一部分的问题(。

例如,我可以运行程序次数,每次都给它相同的文件,第一次两次失败,第三次运行良好。或者我可以运行它 10 次,第一次 9 次运行良好,最后一次失败。由于失败似乎是随机的,我无法理解这里不起作用的地方。

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

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

最新更新