Encontrar todos los archivos de un esquema de nomenclatura particular en java

Supongamos que tengo un montón de archivos con ese nombre:

10011-1-chassis.EDRW
10011-2-front.EDRW
10011-3-rear.EDRW
20011-1-chassis.EDRW
20011-2-front.EDRW
20011-3-back.EASM
20011-3-cover.EASM

Si solo quiero los archivos 20011-x, ¿cómo los enumeraría todos y luego solo los archivos apropiados para poder presentar los nombres de archivo en un JOptionPane para que el usuario elija de un menú desplegable qué archivo le interesa?

preguntado el 16 de mayo de 11 a las 16:05

3 Respuestas

Utilizar JFileChooser en vez de JOptionPane con lista. P.EJ

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.io.File;

class ShowPrefixedDrawings {

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.setMultiSelectionEnabled(true);
                chooser.setAcceptAllFileFilterUsed(false);
                String prefix = JOptionPane.showInputDialog(
                    null, "Prefix", "D");
                chooser.setFileFilter(
                    new PrefixDrawingFileFilter(prefix));
                int result = chooser.showOpenDialog(null);
                if (result==JFileChooser.APPROVE_OPTION) {
                    File[] files = chooser.getSelectedFiles();
                    for (File file : files) {
                        System.out.println(file.getName());
                    }
                }
                System.exit(0);
            }
        });
    }
}

class PrefixDrawingFileFilter extends FileFilter {

    String prefix;
    String[] suffixes = {"dwg", "dxf", "DWG", "DXF"};

    PrefixDrawingFileFilter(String prefix) {
        this.prefix = prefix;
    }

    public boolean accept(File f) {
        if (f.isDirectory()) return true;

        String name = f.getName();
        if ( name.startsWith(prefix) ) {
            for (String type : suffixes) {
                if (name.endsWith(type)) return true;
            }
        }

        return false;
    }

    public String getDescription() {
        return "eDrawings Viewer files starting with " + prefix;
    }
}

contestado el 16 de mayo de 11 a las 22:05

El único problema es que esto se utilizará para iniciar un archivo edrawings y el uso de un JFileChooser permitirá al usuario elegir cualquier archivo para abrir, ¿no es así? ¿Significa que podían abrir lo que quisieran? - davidahines

@dah: "... ¿abrir lo que quisieran?" ¿Qué pasó cuando lo probaste? AFAIU, la única forma de devolver información falsa es escribir nombres de archivo falsos en el campo 'Nombre de archivo:' del selector de archivos. Incluso entonces, un poco de verificación rápida en el otro lado eliminaría a los usuarios sin sentido. Pop un JOptionPane señalando que son un cráneo entumecido y probablemente seleccionarán archivos con el mouse a partir de entonces. ;) Por cierto, ¿qué extensión de archivo se utiliza para edrawings? - Andrew Thompson

@dah: "EDRW y EASM son las extensiones utilizadas". Eh. Navegué hasta el sitio y tuve la impresión de que los tipos eran DWG y DXF. No importa, cámbielos según sea necesario. - Andrew Thompson

@dah: "¿Es posible limitar un JFilechooser a un directorio?" junto al FileSystemView consejo en ese hilo, es posible que también desee eliminar el if (f.isDirectory()) return true; línea en el filtro de archivo. - Andrew Thompson

Escribir a java.io.FilenameFilter que utiliza una expresión regular que filtra los nombres de archivo inaceptables.

Recomiendo una expresión regular porque supongo que querrá cambiar el patrón dinámicamente. No es exagerado en ese caso. Una solución cableada para el ejemplo que cita no me parece tan útil. Supongo que los usuarios querrán decirle cómo vienen ellos desea cambiar el patrón especificándolo en su interfaz de usuario ..

contestado el 16 de mayo de 11 a las 21:05

En este caso, los usuarios solo podrán abrir dos tipos de archivos, ya que esta sección de la aplicación no puede permitir que se abran archivos que no sean edrawings. - davidahines

Utilización de filename.startsWith ("20011-") como su predicado de filtrado.

contestado el 16 de mayo de 11 a las 21:05

Esto debería ser solo un comentario a la respuesta dada por @duffymo - MRE

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.