Как проверить, является ли URL из пакета Eclipse каталогом? - PullRequest
2 голосов
/ 03 января 2011

Я пытаюсь заполнить каталог содержимым пакета, встроенного в мой плагин. Следующий код работает, когда пакет является файловой системой, но не работает, когда пакет является JAR.

Как лучше всего проверить, является ли URL каталогом? Или есть совершенно другой, лучший подход для создания файловой структуры из пакета ресурсов?

    static private void bundleCopy(String dir, String destination) throws IOException {
    Bundle bundle = com.mds.apg.Activator.getDefault().getBundle();

    for (@SuppressWarnings("unchecked")
        Enumeration<URL> en = (Enumeration<URL>) bundle.findEntries(dir, "*", true); 
            en.hasMoreElements();) {
        URL url = en.nextElement();
        String toFileName = destination + url.getPath().substring(dir.length());
        File toFile = new File(toFileName);
        InputStream in;

        try {
            in = url.openStream();
        } catch (FileNotFoundException e) {
            // this exception get thrown for file system directories but not for jar file ones
            if (!toFile.mkdir()) {
                throw new IOException("bundleCopy: " + "directory Creation Failed: "
                        + toFileName);
            }
            continue;
        }
        FileCopy.coreStreamCopy(in, toFile);
    }
}

Ответы [ 2 ]

1 голос
/ 03 января 2011

Я нашел ответ:

Ключевым моментом является то, что записи перечисления для каталогов оканчиваются на '/'.

Следующее правильно различает каталоги и файлы для JAR-файлов и файловых систем:

    static private void bundleCopy(String dir, String destination) 
    throws IOException, URISyntaxException {

    Bundle bundle = com.mds.apg.Activator.getDefault().getBundle();
    Enumeration<URL> en = bundle.findEntries(dir, "*", true);
    while (en.hasMoreElements()) {
        URL url = en.nextElement();
        String pathFromBase = url.getPath().substring(dir.length()+1);
        String toFileName = destination + pathFromBase;
        File toFile = new File(toFileName);

        if (pathFromBase.lastIndexOf('/') == pathFromBase.length() - 1) {
            // This is a directory - create it and recurse
            if (!toFile.mkdir()) {
                throw new IOException("bundleCopy: " + "directory Creation Failed: " + toFileName);
            }
        } else {
            // This is a file - copy it
            FileCopy.coreStreamCopy(url.openStream(), toFile);
        }        
    }
}
0 голосов
/ 03 января 2011

Вы можете попробовать что-то вроде new File(FileLocator.resolve(url).toUri()), чтобы преобразовать URL-адрес, специфичный для Eclipse, в URL-адрес, использующий собственный протокол Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...