Подсчет файлов в папке, игнорируя скрытые файлы, игнорируя вложенные папки, в JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Подсчет файлов в папке, игнорируя скрытые файлы, игнорируя вложенные папки, в Java

Сообщение Anonymous »

Просто подсчитать файлы в Java оказывается на удивление сложно.
Я хочу указать на папку и подсчитать файлы, найденные на верхнем уровне этой папки. Игнорируйте скрытые файлы, например имена в стиле Unix, начинающиеся с .. Игнорировать вложенные папки.
Пример:

Код: Выделить всё

📂 Sales
📂 Wine Sales 2024
📄 .DS_Store
📄 Interim report.text
📂 Q1
📄 West region.text
📄 East region.text
📂 Q2
📂 Q3
📂 Q4
Если я укажу на папку с именем «Wine Sales 2024», я хочу получить счетчик 1 для количества файлов, найденных непосредственно в этой папке. В данном случае — Промежуточный отчет.текст. Я хочу игнорировать папки внутри. Мне не нужен рекурсивный подсчет любых документов, найденных в этих вложенных папках.

Код: Выделить всё

File#listFiles
Я нашел вопрос: Подсчет количества файлов в каталоге с помощью Java. Но на самом деле этот вопрос касается проблем с производительностью, а проблемы с производительностью меня не волнуют. У меня есть простые папки, в которых может быть дюжина документов; Мне просто нужен простой способ подсчета.
В этом Вопросе есть какой-то неуклюжий код, который не соответствует моим основным критериям. Эта строка:

Код: Выделить всё

new File().listFiles().length
… например:

Код: Выделить всё

 final int countFilesFound = Objects.requireNonNull( path.toFile( ).listFiles( ( folder , name ) -> !name.startsWith( "." ) ) ).length;
… есть несколько проблем:
  • ❌ Считает вложенные папки файлами. Я хочу игнорировать вложенные папки.
  • ✅ Что касается игнорирования скрытых файлов, я могу передать лямбду (папка, имя) -> !name.startsWith( "." ) что действительно работает.
  • ❌ Мне нужно преобразовать мой объект Path в File, чтобы это работало, что мне кажется глупым, но в этом нет ничего страшного.
  • ❌ Косвенный и сложный метод: необходимо создать массив, а затем запросить его длину.

Код: Выделить всё

Files.list
В этом ответе показан код, использующий функции Java NIO в Java 8+.

Код: Выделить всё

try (Stream files = Files.list(Paths.get("your/path/here"))) {
long count = files.count();
}
Я адаптировал это к этому частичному решению:

Код: Выделить всё

final long count;
try
{
count = Files.list( path ).filter( Files :: isRegularFile ).count( );
}
catch ( IOException e )
{
throw new RuntimeException( e );
}
Проблемы включают в себя:
  • ❌ Необходимость обертывания в try-catch. Это работоспособно, но ух ты, как много строк для такой простой цели подсчета файлов.
  • ❌ Вызов .list в моей IDE содержит предупреждение о том, что мне нужно попробовать- ресурсы здесь. Я не могу понять необходимость вызова close для потока с терминальной операцией ( здесь). Я никогда не сталкивался с этой проблемой за все время использования потоков.
  • ✅ Успешно игнорирует папки.
Есть ли там есть ли простой способ получить список и/или количество реальных файлов, найденных непосредственно в папке?

Подробнее здесь: https://stackoverflow.com/questions/790 ... rs-in-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»