Я хочу указать на папку и подсчитать файлы, найденные на верхнем уровне этой папки. Игнорируйте скрытые файлы, например имена в стиле Unix, начинающиеся с .. Игнорировать вложенные папки.
Пример:
Код: Выделить всё
📂 Sales
📂 Wine Sales 2024
📄 Interim report.text
📂 Q1
📄 West region.text
📄 East region.text
📂 Q2
📂 Q3
📂 Q4
Код: Выделить всё
File#listFiles
В этом Вопросе есть какой-то неуклюжий код, который не соответствует моим основным критериям. Эта строка:
Код: Выделить всё
new File().listFiles().length
Код: Выделить всё
final int countFilesFound = Objects.requireNonNull( path.toFile( ).listFiles( ( folder , name ) -> !name.startsWith( "." ) ) ).length;
Считает вложенные папки файлами. Я хочу игнорировать вложенные папки.
-
Что касается игнорирования скрытых файлов, я могу передать лямбду (папка, имя) -> !name.startsWith( "." ) это работает.
Мне нужно преобразовать мой объект Path в File, чтобы это работало, что мне кажется глупым, но в этом нет ничего страшного.
Косвенный и сложный метод: необходимо создать массив, а затем запросить его длину.
Код: Выделить всё
Files.list
Код: Выделить всё
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 для потока с терминальной операцией (
здесь). Я никогда не сталкивался с этой проблемой за все время использования потоков.Код: Выделить всё
.count
-
Успешно игнорирует папки.
Подробнее здесь: https://stackoverflow.com/questions/790 ... rs-in-java