簡體   English   中英

Java File.renameTo(File)不起作用

[英]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機器。

編輯 :添加了fnewFile打印輸出,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM