Выбор «Компьютер» или «Библиотеки» в Java JFileChooser приводит к странному объекту File - PullRequest
2 голосов
/ 17 февраля 2012

Я использую JFileChooser в очень стандартной ситуации «Сохранить как».Я создаю файл, и пользователь выбирает, где его сохранить.

Смущает, что пользователь может выбрать количество «ненастоящих» папок.В Windows 7 это: Компьютер, Сеть, Библиотеки, Домашняя группа.Когда я вызываю chooser.getSelectedFile ();Я получаю объект файла, но это очень странно.Имеет смысл, что это будет странный объект File, поскольку он не соответствует файлу, который действительно может существовать.Если я пытаюсь использовать файл, например, вызывая getCanonicalPath, я получаю IOException.Но что, как программист, не имеет смысла, так это отсутствие у меня информации об этом объекте File или его родительском объекте.

Я хотел бы настроить JFileChooser так, чтобы он не позволял пользователю создавать такиевыбор.До сих пор я обнаружил, что с помощью этого работает:

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

Однако пользователь затем выбирает каталог нового файла, но не имя.

С другой стороны, я хотел бы хотя бы объяснить, почему они не могут сохранить в этом месте.Все мои попытки получить имя, например, «Компьютер», «Сеть» или «Библиотеки», потерпели неудачу.Используя Java 6 в Windows 7, методы FileSystemView, такие как isComputerNode и isFileSystem, которые должны решить этот вопрос, не помогают.

import java.awt.Component;
import java.io.File;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;

public class JChooserTest {

public static void main(String[] args) {

    JFileChooser chooser = new JFileChooser();
    chooser.setSelectedFile(new File("C:/foo.txt"));
    chooser.setDialogTitle("Save As");
    chooser.setFileHidingEnabled(true);
    chooser.setMultiSelectionEnabled(false);
    chooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_AND_DIRECTORIES);
    chooser.setDialogType(JFileChooser.SAVE_DIALOG);
    Component parentComponent = null; // is not null in the real world 
    int state=chooser.showDialog(parentComponent, "Save As");
    if (state == JFileChooser.CANCEL_OPTION) return;

    File dest = chooser.getSelectedFile();

    try {
        System.out.println("Valid Destination: " + dest.getCanonicalPath());

    } catch (IOException ex) { // getCanonicalPath() threw IOException

        File parent = dest.getParentFile();

        FileSystemView fsv = FileSystemView.getFileSystemView();

        //log.error("Error determining the CanonicalPath of " + dest, ex);
        System.out.println("dest.getName: " + dest.getName());
        System.out.println("parent.getName: " + parent.getName());          
        System.out.println("getSystemDisplayName of dest: " + fsv.getSystemDisplayName(dest));
        System.out.println("getSystemDisplayName of parent: " + fsv.getSystemDisplayName(parent));          
        System.out.println("getSystemTypeDescription of dest: " + fsv.getSystemTypeDescription(dest));
        System.out.println("getSystemTypeDescription of parent: " + fsv.getSystemTypeDescription(parent));
        System.out.println("isFileSystem of dest: " + fsv.isFileSystem(dest));
        System.out.println("isFileSystem of parent: " + fsv.isFileSystem(parent));
        System.out.println("isComputerNode of dest: " + fsv.isComputerNode(dest));
        System.out.println("isComputerNode of parent: " + fsv.isComputerNode(parent));          
        System.out.println("dest" + dest.isDirectory());
        System.out.println("parent" + parent.isDirectory());
    }
}

}

1 Ответ

1 голос
/ 18 февраля 2012

Возвращенный объект File имеет имя ::{031E4825-7B94-4DC3-B131-E946B44C8DD5}.К сожалению, на самом деле это имя папки библиотек, и оно существует только в воображении Проводника, а не для кого-либо еще.

Например, создайте папку где-нибудь (например, на рабочем столе) под названием foo.{031E4825-7B94-4DC3-B131-E946B44C8DD5} и откройте его.Исследователь подумает, что это папка Библиотеки, но все остальное будет ужасно запутано:

 Directory of C:\Users\Faux\Desktop\lol.{031E4825-7B94-4DC3-B131-E946B44C8DD5}

17/02/2012  08:06 pm    <DIR>          .
17/02/2012  08:06 pm    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  794,214,469,632 bytes free

Что касается того, как убедить средство выбора файлов не показывать их, я понятия не имею.Я бы предложил попробовать getCanonicalPath(), перехватить исключение (как вы) и вернуть его пользователю;предполагая, что они выбирают где-то еще.

...