java - RenameTo 似乎随机失败

标签 java file-rename

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

我的问题是:我给我的程序一个文件,然后它应该加密它,计算加密文件的哈希值,并用这个哈希值重命名这个加密文件。 为此,我首先创建名为“tmp”的加密文件,然后计算他的名字(在下面的代码中调用“myfile.setFileID()”),然后使用 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。 另外,我现在已经运行了很多测试,它可能会失败或使用相同的文件输入(哦,除了即使对于相同的输入文件,加密的文件也不会相同,因为 key 是随机的.. .所以是的,RenameTo 的输入不一样,但我的意思是这不是“文件未找到”问题或来 self 的程序其他部分的问题)。

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

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

最佳答案

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

关于java - RenameTo 似乎随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722941/

相关文章:

java - 如何使 ExecutorService 中的线程与 Runnable 进行通信?

java - 查询 Jersey REST 服务时发生消息异常 (com.sun.jersey.api.MessageException)

java - 如何将.cer公钥导入java信任存储区?

python - Path.replace 相当于 os.replace 或 Shutil.move 吗?

linux - 将每个目录的名称添加到linux中相应目录内的文件中

java - JFormattedTextField 和 NumberFormat 与 Float 一起使用

java - 解析 JSON 并指定投影时的 com.mongodb.util.JSON.parse 限制

java - 在 for 循环中重命名文件时出错

asp.net - 通过文件上传控件上传时在 c#.net 中重命名文件,并将文件的更改名称保存在数据库中

linux - 如何重命名 Linux CentOS 7 上的所有(子)目录和文件