Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поддержка групповых операций, Как получить список файлов 
V
    Опции темы
lazycat
Дата 31.1.2008, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: 1
Всего: 1



Доброго времени суток всем!

Простите за чайный вопрос, но попал в тупик. Задача: есть имя файла с символами замещения (например,  file*.txt). Как получить список всех файлов, удовлетворяющих шаблону?
Конечно, можно было бы воспользоваться File.list() а потом сделать грамматический разбор, но наверное должен быть более простой способ?

Заранее благодарен всем откликнувшимся
PM MAIL   Вверх
Ulysses4j
Дата 31.1.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 2
Всего: 10



Именно Fil.list()!  Только с правильным аргументом (FilenameFilter):

Код

        File curDir = new File(System.getProperty("user.dir")); // поищем в текущей директории для примера

        final Pattern myFilesPattern = Pattern.compile("file.*.txt");
        String[] myFiles = curDir.list(new FilenameFilter() {

            public boolean accept(File dir, String name) {
                return myFilesPattern.matcher(name).matches();
            }
        });

        // посмотрим, что дал поиск
        for (String myFile : myFiles) {
            System.out.println(myFile);
        }




--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
LSD
Дата 31.1.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ulysses4j, у тебя неправильная регулярка.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ulysses4j
Дата 31.1.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 2
Всего: 10



Поясните, пожалуйста, в чем: эта регулярка вывела файлы "file1.txt fileFun.txt".

Добавлено через 4 минуты и 28 секунд
И не вывела "fileWoh"

Добавлено через 5 минут и 26 секунд
А более тонкую подводку человек уже должен сам делать, исходя из того, что ему нужно: в конце концов, вопрос заключался не в этом.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Kangaroo
Дата 31.1.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Может надо было вторую точку сделать точкой, а не любым символом?
Код

final Pattern myFilesPattern = Pattern.compile("file.*\\.txt");



--------------------
Lost....
PM MAIL MSN   Вверх
LSD
Дата 31.1.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Ulysses4j @  31.1.2008,  12:23 Найти цитируемый пост)
Поясните, пожалуйста, в чем: эта регулярка вывела файлы "file1.txt fileFun.txt".

Код

Pattern pattern = Pattern.compile("file.*.txt");
Matcher matcher = pattern.matcher("file1txt");
System.out.println("matches = " + matcher.matches());

и вообще чаще, проще обойтись startsWith()/endsWith() быстрее будет работать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
lazycat
Дата 31.1.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: 1
Всего: 1



Большое спасибо, Ulysses4j!

Правда, это несколько не то, что я ожидал. Я искал "нечто", чему бы передал шаблон, а оно мне в ответ Enumeration с именами файлов, соответствующих шаблону. В С подобное есть и я удивлялся, почему бы ему не быть в Java.
Решение, которое Вы прислали, хорошее, но при этом надо просматривать переданную строку, заменять в ней * на .*,  ? на . , потом предварять каждый "ненормальный" символ обратным слэшем, одним словом код разрастается.

Увы, наши желания часто расходятся с действительностью

Еще раз спасибо!

PM MAIL   Вверх
Kangaroo
Дата 31.1.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(lazycat @  31.1.2008,  14:38 Найти цитируемый пост)
но при этом надо просматривать переданную строку, заменять в ней * на .*,  ? на . 

Какую строку? Зачем заменять?
Ulysses4j использовал шаблон, возвращаются файлы, которые соответствуют этому шаблону..


--------------------
Lost....
PM MAIL MSN   Вверх
lazycat
Дата 31.1.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: 1
Всего: 1



Так пользователь же не знает языка регулярных выражений. Единственное, что для него доступно - это символы замещения ? и * в именах файлов. А сделать из того, что получу шаблон - это моя задача.

PM MAIL   Вверх
Kangaroo
Дата 31.1.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(lazycat @  31.1.2008,  15:43 Найти цитируемый пост)
Так пользователь же не знает языка регулярных выражений. Единственное, что для него доступно - это символы замещения ? и * в именах файлов. А сделать из того, что получу шаблон - это моя задача.

хе, теперь понятно. 

Цитата(lazycat @  31.1.2008,  14:38 Найти цитируемый пост)
Я искал "нечто", чему бы передал шаблон, а оно мне в ответ Enumeration с именами файлов, соответствующих шаблону. В С подобное есть и я удивлялся, почему бы ему не быть в Java.

Ну тут уж мы не виноваты, что пользователь шаблоны для С знает, а для Java не выучил..  smile 


--------------------
Lost....
PM MAIL MSN   Вверх
lazycat
Дата 31.1.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: 1
Всего: 1



Цитата

Ну тут уж мы не виноваты, что пользователь шаблоны для С знает, а для Java не выучил..


Странное утверждение.

Есть шаблоны для работы с файловой системой (по сути они включают только два символа: * и ?. Их знает и применяет пользователь.
Есть шаблоны регулярных выражений, те, которые используем мы.
В C есть функции, которые позволяют получить набор файлов, соответствующих тому шаблону, который ЗАДАЛ ПОЛЬЗОВАТЕЛЬ. При этом нет необходимости использовать регулярные выражения. (Да по большому счету, до появления LEX и YACC в C они и не поддерживались.)
В Java подобных классов и методов нет (или я их пока не нашел).
Вот и все. И не надо требовать от пользователя знания регулярных выражений.

PM MAIL   Вверх
Kangaroo
Дата 31.1.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(lazycat @  31.1.2008,  16:12 Найти цитируемый пост)
Странное утверждение.

Смайлы для твого и существует, чтобы передавать эмоции. Это была шутка, не принимайте близко к сердцу.

И вообще - это оффтоп. Пора заканчивать.


--------------------
Lost....
PM MAIL MSN   Вверх
lazycat
Дата 31.1.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: 1
Всего: 1



Цитата

И вообще - это оффтоп. Пора заканчивать. 


Это точно.

Спасибо всем за участие

PM MAIL   Вверх
alex_nevolin
Дата 8.2.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 13.8.2007

Репутация: 3
Всего: 4



Подниму вопрос, но в новом ракурсе:
Есть шаблон для поиска файлов "*/popups/*" - найти все файлы в подпапках popups
Сделал regexp ".*/popups/.*" имплементировал фильтр:
Код

        final Pattern pattern = Pattern.compile(".*/popups/.*");
        File[] files = file.listFiles(new FileFilter() {
            public boolean accept(File file) {
                String canonicalPath = null;
                try {
                    canonicalPath = file.getCanonicalPath();
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
                return pattern.matcher(canonicalPath).matches();
            }
        });

Проблема в том что getCanonicalPath() is system-dependent. т.е. получаю разные слэши для Windows и Unix like систем. Для windows приходится делать regexp ".*\\\\popups\\\\.*"
Как с этим боротся? Решения System.getProperty("os.name") прошу не предлагать.
Может надо сам шаблон подстроить по обе оси? Может можно как-то работать с "file path" sytem independent?
PM MAIL   Вверх
Kangaroo
Дата 8.2.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



alex_nevolin, попробуйте использовать File.separator:
Код

Pattern.compile(".*"+File.separator+"popups"+File.separator+".*");



--------------------
Lost....
PM MAIL MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.