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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск файлов определенного расширения, найти на выбранном диске все файлы 
:(
    Опции темы
Rauko
Дата 5.9.2015, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



задача - найти все файлы avi+mp3 на выбранном диске

Код

for (File f : File.listRoots()) {
    String[] names = f.list();
    if (names != null) {
        // do something
    }
}


нашла такую конструкцию для этой задачи, есть вопросы:
 - как выяснить расширение файла?
 - как вывести название файла с расширением(без пути к файлу)?
 - как вывести файл на экран с возможностью вызова файла? (конкретней, что нужно привязать к кнопке в оконной форме для вызова файла)

если не разберусь с выбором диска - вернусь еще и с этим вопросом... потоки пока не знаю(для справки для отвечающего)
PM MAIL   Вверх
Pawl
Дата 5.9.2015, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я делал нечто похожее - архивация файлов с заданными расширениями из указанного каталога. Архивация осуществлялась при помощи библиотеки zip4j, но вам она, понятно, не нужна. Правда, программа консольная, но в ней есть возможность и выбора каталога (диска) и задание определённых расширений. Короче, разбирайтесь, а если что - пишите!smile
Код

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Predicate;

import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.io.ZipOutputStream;
import net.lingala.zip4j.model.ZipParameters;

import static java.nio.file.Files.readAllBytes;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toList;

public class ZipFiles {
    private Lock lock = new ReentrantReadWriteLock().writeLock();
    private AtomicInteger c = new AtomicInteger(0);
    private ZipParameters parameters = new ZipParameters();
    private Predicate<File> isFile;
    private String archPath, filesPath;

    public ZipFiles(String archPath, String filesPath, int compresLevel, String... exts) {
        parameters.setCompressionLevel(compresLevel); //1 3 5 7 9
        this.archPath = archPath;
        this.filesPath = filesPath;
        isFile = (exts.length > 0) ? ((Predicate<File>) File::isFile).and(stream(exts)
                .<Predicate<File>>map(ext -> f -> f.getName().endsWith(ext)
                        || f.getName().endsWith(ext.toUpperCase())).collect(toList())
                .stream().reduce(w -> false, Predicate::or)) : File::isFile;
    }

    protected class ArchiveAction extends RecursiveAction {
        private ZipOutputStream zos;
        private File file;

        private ArchiveAction(File file, ZipOutputStream zos) {
            this.file = file;
            this.zos = zos;
        }

        @Override
        protected void compute() {
            invokeAll(stream(file.listFiles(File::isDirectory)).parallel()
                    .map(f -> new ArchiveAction(f, zos)).collect(toList()));
            stream(file.listFiles(isFile::test)).parallel().forEach(file -> {
                System.out.println("Writing '" + file.getPath() + "' to zip file");
                try {
                    lock.lock();
                    zos.putNextEntry(file, parameters);
                    zos.write(readAllBytes(Paths.get(file.getPath())));
                    zos.closeEntry();
                    c.getAndIncrement();
                } catch (IOException | ZipException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            });
        }
    }

    public void doArchive() {
        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(archPath))) {
            ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
            pool.invoke(new ArchiveAction(new File(filesPath), zos));
            zos.finish();
            System.out.println("archived files: " + c.intValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String archPath = "D:\\temp\\arch.zip", filesPath = "d:\\temp\\read";
        String[] exts = {"txt", "fb2", "rtf"};
        new ZipFiles(archPath, filesPath, 5, exts).doArchive();
    }
}


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
CPlusPlusFAN
Дата 5.9.2015, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



Чтот типа того:
Код

final List<File> files = new ArrayList<>();
final PathMatcher aviMp3Matcher = FileSystems.getDefault().getPathMatcher("glob:*.{avi,mp3}");
Files.walkFileTree(Paths.get("C:/"), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
            throws IOException {
        if (!attrs.isDirectory() && aviMp3Matcher.matches(file.getFileName())) {
            files.add(file.toFile());
        }
        return FileVisitResult.CONTINUE;
    }
    
    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        System.out.println(String.format("File %s is inaccessible", file));
        return FileVisitResult.SKIP_SUBTREE;
    }
});

System.out.println(files);

PM MAIL ICQ Jabber   Вверх
AntonSaburov
Дата 7.9.2015, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



А чем не устраивает listFiles с фильтром ?
http://docs.oracle.com/javase/7/docs/api/j...o.FileFilter%29
PM MAIL WWW ICQ   Вверх
Rauko
Дата 19.9.2015, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



итак, продолжим (перерыв работе закончен)

Написала следующий код:
Код

import projectFifes.*;

public class FileManager {
    public static void main(String[] args){
        WindowCreate.create();
    }
}

Код

public class WindowCreate {
    public static void window()  {
        JFrame frame = new JFrame("Multimedia Blooghound");
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(new JLabel("   Choose logic disk for searching multimedia files:"), BorderLayout.NORTH);
        frame.setSize(250, 400);
        frame.setLocation(200, 100);
        
        GridLayout frameTab = new GridLayout(1,File.listRoots().length);
        frameTab.setHgap(5);
        frameTab.setVgap(5);
        
        JPanel panel = new JPanel();
        panel.setLayout(frameTab);

        panel.setBorder(new EmptyBorder(5,5,5,5));
        
        for (final File f : File.listRoots()) {    //описываем поиск дисков на компьютере, 
                                                    //создание кнопок и выполнение действий
                                                    //для каждой из них в случае нажатия
            JButton diskBtn = new JButton("Disk " + f);
            panel.add(diskBtn);
            //привязка вызова нового окна со списком файлов по нажатию кнопки
            diskBtn.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent arg) {
                    listFrame(f);
                }
            });
        }
        
        frame.add(panel);
        frame.setResizable(false); //фиксирует размер окна, окно появляется неизменяемым
        frame.pack();
        frame.setVisible(true);          
    }
         
    public static void create() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                window();
            }
        });
    }
    
    public static void emptyDiskErr(File f){
        JDialog fr = new JDialog();
        JDialog frame = new JDialog(fr, "Error! Problems with disk " + f);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(300, 100);
        frame.setLocationRelativeTo(null);
        
        JPanel panel = new JPanel();
        
        panel.setBorder(new EmptyBorder(5,23,23,5));
        panel.add(new JLabel("Logic disk is empty or was unmounted!!!"));
                
        frame.setResizable(false);
        frame.add(panel);        
        frame.setVisible(true); 
        
    }

    public static String weight(File file){
        long len = file.length();
        String result = "";
        long big = 1024;
        if(len < big) {
            result = len + "B";
        } else if (len < big*1024) {
            result = len/big + "KB";
        } else if (len < big*1024*1024) {
            result = len/big/big + "MB";
        } else if (len < big*1024*1024*1024) {
            result = len/big/big/big + "GB";
        }
        return result;
    } 
    
    public static String getFileExtention(String filename){
        int dotPos = filename.lastIndexOf(".") + 1;
        return filename.substring(dotPos);
    } 
    
    
    public static void listFrame(File f) {
        Vector<String> column_names = new Vector<String>();
        // формируем список названий полей (колонок)
        column_names.add("File Name");
        column_names.add("File extention");
        column_names.add("File size");
        column_names.add("Play button");
        
     // теперь каждую из записей следует поместить внутрь еще одного списка
        Vector<File> vec_data = new Vector<File>();
        ;
        vec_data.addAll(FileSearch.searching(f));
        
        
        JFrame frame = new JFrame("File search result on disk " + f);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(400, 700);
        frame.setLocationRelativeTo(null);
        JTable table = new JTable(vec_data, column_names);

        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.setVisible(true);  
    }
    
    
}

class ExtensionFilter implements FilenameFilter {
    private final String extension;
  
    public ExtensionFilter(String ext) {
        extension = ext;
    }

    public boolean accept(File dir, String name) {
        return name.endsWith(extension);
    }         
}

Код

public class FileSearch {
    public static Vector<File> searching(File f) {
        // Каталог, в котором осуществляется поиск
        String DIR_NAME = "" + f;
         
        // Расширение файлов, которые необходимо удалить
        String[] EXTENSION = {".mp4", ".mp3", ".avi", ".mkv", ".ogm", ".flac"};
        Vector<File> result = new Vector<File>();
        
        for(String ext: EXTENSION){
     
            final FilenameFilter filter = new ExtensionFilter(ext);
            final File dir = new File(DIR_NAME);
             
            // Полчаем список нужных нам файлов
            String[] filenames = dir.list(filter);
         
            for(String filename: filenames) {
                String fullFilename = new StringBuilder().append(DIR_NAME).append(File.separator).append(filename).toString();
             File file = new File(fullFilename);
             result.add(file);
            }
        }
        return result;
    }
     
    // Вложенный класс, реализующий интерфейс FilenameFilter, с помощью
    // которого мы получаем список файлов с нужным расширением
    private static class ExtensionFilter implements FilenameFilter {
        private final String extension;
         
        public ExtensionFilter(String ext) {
            extension = ext;
        }
 
        public boolean accept(File dir, String name) {
            return name.endsWith(extension);
        }         
    }
}


1. вот, код естественно не работает - вроде проблема в связке Vector+File, вопрос - как это дело можно решить? (найденный пример кода был с вектором, хотелось попробовать код с ним)

2. как вычислить размер файла?  smile 

3. прочла, что описанный у меня метод создания таблиц имеет недостаток - данные в таблице редактируемые (на практике не видела - таблица не отрисовывается в виду ошибки из пункта 1). как решить?

4. как запустить файл по нажатию кнопки? как/через что вытянуть из вектора информацию о полном пути? smile (внятного описания для нуба не нашла, извините... поэтому спрашиваю тут)

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

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

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


 




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


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

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