我必须重命名一个文件。我首先尝试File.renameTo(File)
,但这种方法不起作用。该文件未在其他任何地方打开,无论是在我的程序中,还是在任何其他应用程序中。由于在文档中说这个函数非常依赖于系统,我的下一个方法是创建一个自定义方法。我尝试使用NIO,并使用以下方法:
public boolean renameFile(File from, File to)
{
Path fromPath = from.toPath();
Path toPath = to.toPath();
try {
Files.copy(fromPath, toPath, StandardCopyOption.REPLACE_EXISTING);
Files.delete(fromPath);
} catch (IOException ex) {
return false;
}
return true;
}
我发现我不能这样做,因为当调用Files.delete(fromPath)
时,文件仍然被锁定。我在StackOverfolw上搜索了一下这里找到的this question。解决方案是在循环中等待,直到文件不再被锁定。我试过了,但发现,在退出程序之前,文件从未解锁过。我做了一些研究,发现this。接受的答案是什么,这是known Bug that Oracle can't fix。评论提出了一种解决方法,避免使用NIO:
在这种情况下,我会使用Do-Not-Use-NIO解决方法。
我也试过了,结果是以下代码:
private boolean renameFile(File from, File to)
{
FileInputStream fromIn = null;
FileOutputStream toOut = null;
try
{
fromIn = new FileInputStream(from);
toOut = new FileOutputStream(to);
byte[] buffer = new byte[ 0xFFFF ];
for(int len; (len = fromIn.read(buffer)) != -1;)
{
toOut.write(buffer);
}
}
catch(IOException ex){
return false;}
finally
{
if(fromIn != null)
{
try {fromIn.close();} catch (IOException ex) {}
}
if(toOut != null)
{
try {toOut.close();} catch (IOException ex) {}
}
}
from.delete();
return true;
}
再次,与我之前的尝试一样,所有文件都被复制到了他们的新位置,但from.delete();失败,因为他们被锁定 - 我甚至无法在资源管理器中删除它们。我还测试了流是否未能关闭。但是流正确关闭了。我试图找到更多的解决方案,但我找不到任何新的解决方案。如果有人有任何想法,将会感谢代码片段与解释。如果您知道另一个问题并且未在此处列出答案,欢迎加入。谢谢你的帮助!
GEF