Java的File对象的renameTo方法删除了我的文件而不是重命名它。Vistax64

3
尝试使用字符串变量重命名一个mp3文件。例如,我有一个古典音乐文件夹,路径为C:/classical,我想将一首名为vivaldi的歌曲重命名为FourSeasons。我想找到初始文件C:/classical/vivaldi.mp3的绝对路径,然后提供一个字符串“FourSeasons.mp3”,并将文件C:/classical/vivaldi.mp3更改为C:/classical/FourSeasons.mp3。
我考虑过使用renameTo和文件编写器,但这两种方法都没有给我想要的结果。 renameTo代码:返回false(重命名失败),并且往往会永久删除我的文件。
public static void main(String[] args) {
File mp3 = new File("C:/mp3.mp3");
boolean renamestatus = mp3.renameTo(new File("song.mp3"));
System.out.println(renamestatus);
}

我也尝试使用FileReader和FileWriter来制作文件的精确副本,并更改文件名。这种方法输出的mp3文件会跳过,并且听起来与输入文件远远不同。

这是我的fileWriter代码:

File inputFile = new File("C:/mp3.mp3");
File outputFile = new File("C:/song.mp3");
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read()) != -1)
  out.write(c);
in.close();
out.close();

1
你能重现 renameTo() 删除你的文件的问题吗?你确定它不是只把文件移动到了你意想不到的地方吗?因为如果是这样,那么肯定是一个 bug! - Joachim Sauer
它可以将其移动到系统文件夹或$CLASSPATH或$PATH的某个位置,进行搜索以确保,正如Joachim所说,它很少被删除。 - Simeon
为什么非要将文件移动到“系统文件夹或者 $CLASSPATH 或者 $PATH 中的某个位置”?文件路径是相对于当前工作目录的。 - jarnbjo
@Joachim:如果renameTo返回false,则不应将文件移动到任何意外的位置。 - jarnbjo
@jarnbjo:这也是真的。那么你能够可靠地重现它吗?如果可以,那么你应该将其报告为一个错误。 - Joachim Sauer
5个回答

5

我也遇到了同样的问题,

我使用新文件对象的绝对路径解决了这个问题。

所以在你的情况下:

boolean renamestatus = mp3.renameTo(new File("song.mp3"));

应该是

boolean renamestatus = mp3.renameTo(new File("C://song.mp3"));

其次,如果不使用绝对路径,则文件不会被删除,而是移动到项目的根目录并更改名称。

2
使用renameTo时,您需要指定文件要移动到的路径。例如,如果您使用的原始路径是"C:/mp3.mp3",则您希望在renameTo中指定的路径应该类似于"C:/song.mp3"。因此,您的代码行可能如下所示。
boolean renamestatus = mp3.renameTo(new File("C:/song.mp3"));

希望这对你有帮助。

1

可以试试这样:

mp3.renameTo(new File("C:/song.mp3"));

您还可以查看thisthis的答案。


它不应该改变主要问题。为什么调用renameTo方法并返回false时,原始文件会被删除? - Colin Hebert
@Colin 不应该被删除,它可能只是移动到了默认位置。此外,在相对路径上创建文件会在$PATH的某个地方创建它。我将有时间在大约30分钟内测试它。至于返回false,这很奇怪,但需要更多信息才能找出为什么会发生这种情况。 - Simeon

1

FileReaderFileWriter仅适用于处理文本数据。

您的MP3文件是二进制数据,应该将其视为这样处理,因此需要使用FileInputStreamFileOutputStream进行读取/写入。


0

它不会删除原始文件,它运行良好,只需提供完整路径(源文件路径+新名称)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接