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
将失败(它不会隐式创建它)。
有很多关于 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
将失败(它不会隐式创建它)。