Файл переименовать, чтобы не работал - PullRequest
8 голосов
/ 01 апреля 2012

Я пытаюсь добавить расширение к имени файла, выбранного JFileChooser, хотя не могу заставить его работать.

Это код:

final JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = fc.showSaveDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File f = fc.getSelectedFile();
            String name =f.getAbsoluteFile()+".txt";
            f.renameTo(new File(name));
            FileWriter fstream;
            try {
                fstream = new FileWriter(f);
                BufferedWriter out = new BufferedWriter(fstream);
                out.write("test one");
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

Я не могу понять, почему это не работает. Я также пытался использовать getPath () и getCanonicalPath (), но результат тот же. Файл создается в выбранном каталоге, но без расширения «.txt».

Ответы [ 4 ]

4 голосов
/ 02 апреля 2012

Мне кажется, что все, что вам нужно сделать, это изменить имя выбранного файла, а не переименовывать файл в файловой системе. В этом случае вы не используете File.renameTo. Вы просто меняете File. Должно работать что-то вроде следующего:

        File f = fc.getSelectedFile();
        String name = f.getAbsoluteFile()+".txt";
        f = new File(name);

File.renameTo пытается переименовать файл в файловой системе. Например:

File oldFile = new File("test1.txt");
File newFile = new File("test2.txt");
boolean success = oldFile.renameTo(newFile); // renames test1.txt to test2.txt

После этих трех строк success будет true, если файл test1.txt может быть переименован в test2.txt, и false, если переименование было неудачным (например, test1.txt не существует, это открыть в другом процессе, отказано в разрешении и т. д.)

Я рискну предположить, что вы пытаетесь переименовать, потому что вы пытаетесь переименовать каталог (вы используете JFileChooser с опцией DIRECTORIES_ONLY). Если у вас есть программы, использующие файлы в этом каталоге, или командная строка, открытая внутри, они будут возражать против того, чтобы этот каталог был переименован.

1 голос
/ 01 апреля 2012

Вы также можете использовать утилиту Files.move из библиотек Google Guava для переименования файла.Это проще, чем написать собственный метод.

Из документов:

Перемещает файл из одного пути в другой.Этот метод может переименовать файл или переместить его в другой каталог, например команду Unix mv.

1 голос
/ 01 апреля 2012

Вы пишете не в тот файл. Когда вы вызываете renameTo, текущий файл не меняет своего пути. Попробуйте это:

final JFileChooser fc = new JFileChooser();
    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int returnVal = fc.showSaveDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File f = fc.getSelectedFile();
        String name =f.getAbsoluteFile()+".txt";
        File f2 = new File(name);
        f.renameTo(f2);
        FileWriter fstream;
        try {
            fstream = new FileWriter(f2);
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("test one");
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
0 голосов
/ 08 июня 2016

Если вы хотите переименовать файл, то необходимо закрыть все объекты (например, FileReader, FileWriter, FIS, FOS означает закрытие объекта чтения файла, а затем переименовать его

...