Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Поиск файлов определенного расширения


Автор: Rauko 5.9.2015, 12:30
задача - найти все файлы avi+mp3 на выбранном диске

Код

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


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

если не разберусь с выбором диска - вернусь еще и с этим вопросом... потоки пока не знаю(для справки для отвечающего)

Автор: Pawl 5.9.2015, 16:15
Я делал нечто похожее - архивация файлов с заданными расширениями из указанного каталога. Архивация осуществлялась при помощи библиотеки 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://ru.vingrad.com/Poisk-faylov-opredelennogo-rasshireniya-id55eab6d0ae2015c42b8b4567#findElement_E7045_55eaeaedae201576661cbe91_0

Автор: CPlusPlusFAN 5.9.2015, 17:11
Чтот типа того:
Код

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);

Автор: AntonSaburov 7.9.2015, 09:22
А чем не устраивает listFiles с фильтром ?
http://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles%28java.io.FileFilter%29

Автор: Rauko 19.9.2015, 13:32
итак, продолжим (перерыв работе закончен)

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

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 (хотя бы в общих чертах... это новая для меня тема)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)