[英]Java File.renameTo(File) not working
我正在嘗試列出目錄的內容,並重命名某些文件。
public void run(String dirName) {
try {
File parDir = new File(dirName);
File[] dirContents = parDir.listFiles();
// Rename if necessary
for(File f : dirContents) {
System.out.println("f is:\n" + f.toString());
String name = f.getName();
String subbedName = name.replaceAll("\uFFFD", "_");
System.out.println("\n" + "name = " + name + ", subbedName = " + subbedName + "\n");
if(!name.equals(subbedName)) {
File newFile = new File(f.getParentFile(), subbedName);
System.out.println("newFile is:\n" + newFile.toString());
if(!f.renameTo(newFile))
System.out.println("Tried to change file name but couldn't.");
}
}
}
catch(Exception exc1) {
System.out.println("Something happened while listing and renaming directory contents: " + exc1.getMessage());
}
}
運行此命令時,出現“ Tried to change file name but couldn't.
”我不認為 Java將這些文件視為“打開”的,所以我不認為這是原因。 我什至運行過chmod 777 myDir
,其中myDir
是傳遞給run
方法的dirName
字符串的值。
我在這里想念什么? Java為什么不重命名這些文件? 這些是CentOS機器。
編輯 :添加了f
和newFile
打印輸出,如下所示:
f is:
/root/path/to/mydir/test�.txt
newFile is:
/root/path/to/mydir/test_.txt
問題是f.getName()
返回f
表示的路徑的姓氏部分。 然后,您可以按摩此String並將其變回File
。 但是, File
現在代表相對於當前目錄的路徑,而不是包含原始路徑的目錄。
結果,您的代碼實際上試圖將文件從dirName
重命名為應用程序的當前目錄。 這可能會失敗,因為具有這些名稱的文件已存在於當前目錄中,或者是因為dirName
和當前目錄位於不同的文件系統中。 (您不能將文件從一個文件系統重命名為另一個文件系統...您必須將其復制 。)
請注意,Java中的File
代表路徑名,而不是文件或文件夾。 在您的代碼中, f
對象是String dirname
表示的目錄中文件系統對象(文件或文件夾)的路徑名。 所有這些的f
對象將有一個目錄的一部分。
修復代碼的方法不止一種。 例如
name = f.getName()
更改為name = f.toString()
new File(subbedName)
更改為new File(f.getParentFile(), subbedName)
我有一個替代/附加理論。
包含\�
字符的文件的路徑名顯示為“ mojibake”; 也就是說,當您使用錯誤的編碼顯示編碼的文本時,會得到亂碼。 並且由於我們看到3個字符的亂碼,我懷疑它試圖將\�
的UTF-8渲染顯示為Latin-1。
所以我的理論是,當File.renameTo
方法將f
轉換為它將提供給系統調用的形式時, File.renameTo
發生同樣的想法。 由於某種我不清楚的原因,Java可能使用了錯誤的編碼,結果為原始文件生成了一個“名稱”,該名稱與文件系統中文件的名稱不匹配。 這足以導致重命名失敗。
可能相關的問題/鏈接:
您需要使用這些文件的完整路徑名創建新的File
對象。 所以
String name = f.getName(); // gets the name without the directory
應該可能是:
String name = f.getAbsolutePath();
(您的搜索/替換可能需要更改)
f.getName();
僅返回文件夾的名稱,而不返回完整路徑。 因此subbedName
成為相對路徑文件。 嘗試使用f.getCanonicalPath()
代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.