2016-02-11 3 views
0

Я хотел удалить пробелы, которые Windows помещает в имена файлов. Я выполнил следующий код, чтобы переименовать все файлы в тестовом каталоге. Результат: все файлы исчезли. Я озадачен тем, почему.Почему метод File rename() удаляет файлы?

import java.io.*; 

public class FileRenamer { 
    public static void main(String[] args) { 
     for (File file: (new File("O:\\test0")).listFiles()) 
      file.renameTo(new File(file.getName().replaceAll("\\s",""))); 
     System.exit(0); 
    } 
} 
+0

Вы правы, это должно удалить любые файлы. Он может переместить их в другой каталог. –

+2

Просто, чтобы быть ясным, это _not_ "пространства, которые Windows помещает в имена файлов". Это пробелы, которые _you_ помещают в имена файлов Windows. Сама Windows не добавляет пробелов к вашим именам файлов. Может ли ваш ответ быть более простым: не помещайте места в именах файлов в первую очередь? –

+1

Нет, я сделал массовое переименование в Проводнике Windows. Я выбрал все файлы в каталоге, нажал F2 (который выделил основную часть имени файла (перед точкой)) и набрал «test», а затем нажал Enter. Windows переименовала их «test (1) .png», «test (2) .png» и т. Д. Обратите внимание на пробел перед «(». – John

ответ

2

TL; DR: Вы являются перемещение файла.

Вы указываете файлы в каталоге "O:\\test0.

Для каждого такого файла, а затем создать String:

file.getName().replaceAll("\\s","") 

Вы в конечном итоге с:

new File("someFileName") 

Так вы назвали:

file.renameTo(new File("someFileName")) 

Теперь someFileName не абсолютный путь; но родственник путь. Итак, вы переместились с O:\\test0\\some File Name на someFileName, где someFileName находится в каталоге программы.

P.S. нет необходимости звонить System.exit(0).

+0

Я думаю, что вы пропустили вызов File.listFiles(), он не переименование каталога, но файлов внутри каталога. Но согласитесь, что OP перемещает файлы в текущий рабочий каталог –

+0

@ErwinBolwidt хорошая точка, исправлена. –

0

Да, я обнаружил, что файлы были перенесены в мой каталог файлов классов.

наконечник Бориса об относительных против абсолютных путях показал мне решение: использовать конструктор

public File(File parent, String child) 

для нового абстрактного объекта File. Следующий код правильно выполнил задание.

import java.io.*; 

public class FileRenamer { 
    public static void main(String[] args) { 
     File dir = new File("O:\\test0"); 
     for (File file: dir.listFiles()) 
      file.renameTo(new File(dir, file.getName().replaceAll("\\s",""))); 
    } 
} 
+0

Еще лучше, не используйте устаревшую и дерьмовую Java IO-библиотеку, но новый и гораздо лучший [Java NIO library] (https://docs.oracle.com/javase/tutorial/essential/io/pathClass.html). –

Смежные вопросы