Переименуйте файл в JFileChooser, если файл существует и пользовательское расширение

Код работает так, как должен, пока пользователь не введет имя файла с расширением (.txt), и оно уже существует. Таким образом, если файл "test.txt" существует и пользователь решает назвать новый файл как "test", он будет называться "test(1).txt", но если пользователь добавляет расширение, например "test.txt" файл будет назван как "test.txt", а следующие имена пользователей файла "test.txt" будут сохранены как "test.txt(1).txt". Можно ли получить имя файла от JFileChooserудалить его расширение, если пользователь ввел его, и использовать его в качестве имени нового файла после добавления числа в середине исходного имени файла и его расширения? Я могу получить имя без расширения как тип String, но мне нужно это как тип файла.

         File ft = fc.getSelectedFile();
                String ext = ".txt";
                File tmp = new File(ft.getPath());
                if (!fc.getSelectedFile().getAbsolutePath().endsWith(ext)){ 
                    ft = new File (ft + ext);
                }       
                File test =  new File(ft.getPath());
                File temp = new File(ft.getPath());
                File temp1 = new File(ft.getPath());
                int count = 1;
                while (temp.exists()) {
                    if(tmp.getAbsolutePath().endsWith(ext)){

                    }
                    File ft1 = new File (tmp + "(" + count + ")");
                    ft = new File (tmp + "(" + count + ")" + ext);
                    count++;
                    temp = new File(ft.getPath());
                    temp1 = new File(ft1.getPath());
                }
                if (!temp1.getAbsolutePath().endsWith(ext)){ 
                    ft = new File (temp1 + ext);
                }
                int cnt = count - 1;
                if (!test.equals(temp)){
                JOptionPane.showMessageDialog(null, "File already exists. So it's saved with (" + cnt + ") at the end.");               
                }   

2 ответа

Решение

Итак, я попытался сделать это, не меняя ваш код слишком сильно. Попробуй это:

String filePath = fc.getSelectedFile().getAbsolutePath();
final String ext = ".txt";
String filePathWithoutExt;

if (filePath.endsWith(ext)) {
    filePathWithoutExt = filePath.substring(0, filePath.length() - ext.length());
} else {
    filePathWithoutExt = filePath;
}

File test = new File(filePathWithoutExt + ext);
File temp = new File(filePathWithoutExt + ext);

int count = 0;

while (temp.exists()) {
    count++;
    temp = new File(filePathWithoutExt + "(" + count + ")" + ext);
}

if (!test.equals(temp)) {
    JOptionPane.showMessageDialog(null,
        "File already exists. So it's saved with (" + count + ") at the end.");
}

РЕДАКТИРОВАТЬ:

По рекомендации Марко Н. было бы лучше определить, существует ли расширение, найдя последнюю позицию . так как это также будет работать с расширениями, отличными от ".txt". Это значение будет затем использоваться для разделения строки. Код замены будет выглядеть так:

final int lastPeriodPos = filePath.lastIndexOf(".");

if (lastPeriodPos >= 0) {
    filePathWithoutExt = filePath.substring(0, lastPeriodPos);
} else {
    filePathWithoutExt = filePath;

Однако это также может иметь некоторые проблемы, если пользователь введет имя файла, содержащее . в любом месте, кроме как непосредственно перед расширением файла.

Хм, я думаю, что эта запись также может быть полезна: удалить расширение имени файла в Java

В настоящее время у меня нет времени, чтобы должным образом проверить его (или лучше вообще проверить), но разве это не должно работать так:

public static String removeExtention(File f) {

    String name = f.getName();

    // Now we know it's a file - don't need to do any special hidden
    // checking or contains() checking because of:
    final int lastPeriodPos = name.lastIndexOf('.');
    if (lastPeriodPos <= 0)
    {
        // No period after first character - return name as it was passed in
        return f;
    }
    else
    {
        // Remove the last period and everything after it
        File renamed = new File(f.getParent(), name.substring(0, lastPeriodPos));
        return renamed;
    }
}

Я кратко попытался откорректировать код из сообщения, упомянутого выше, и он вполне может содержать некоторые ошибки или недостатки. (Если вы найдете что-то, не стесняйтесь комментировать их. Некоторые из них могут быть из-за моей нехватки времени, но я всегда готов учиться и совершенствоваться.) Однако я надеюсь, что это может помочь вам найти правильное решение к вашей проблеме.

Другие вопросы по тегам