Avatar billede dl Nybegynder
06. juni 2006 - 21:36 Der er 7 kommentarer og
1 løsning

gemmensøgning af filer med wildcard

jeg har med hjælp fra arne_v.
Men hvordan får jeg Wildcard ind i det.
fx *.dat

Jeg har set lidt på  Pattern  klassen, men kan sku ikke lige få den til at virker.

jeg har denne kode:


import java.io.File;
import java.util.LinkedList;
import java.util.List;

public class FileHandler {
    public FileHandler() {
    }

    public List findFiles(String path, boolean showOnlyFiles) {
        List fileList = new LinkedList();
        find(path, fileList);
        return fileList;
    }

    private void find(String path, List result) {
        File dir = new File(path);
        String[] dirlist = dir.list();
        if(dirlist != null) {
            for (int i = 0; i < dirlist.length; i++) {
// System.getProperty("file.separator") returnerer \ paa Windows  og / paa
// Unix/Linux
                String fnm = dir + System.getProperty("file.separator") + dirlist[i]; 
                if (new File(fnm).isFile())
                    result.add(new String(fnm));
                if (new File(fnm).isDirectory())
                    find(fnm, result);               
            }
        }
    }

   
}

Hvad gør jeg :P ?
Avatar billede _carsten Nybegynder
06. juni 2006 - 22:14 #1
Du kan bruge FilenameFilter


import java.io.File;
import java.io.FilenameFilter
import java.util.LinkedList;
import java.util.List;

public class FileHandler {
    public FileHandler() {
    }

    public List findFiles(String path, boolean showOnlyFiles) {
        List fileList = new LinkedList();
        find(path, fileList);
        return fileList;
    }

    private void find(String path, List result) {
        File dir = new File(path);
        String[] dirlist = dir.list( new Filter() );    // HER
        if(dirlist != null) {
            for (int i = 0; i < dirlist.length; i++) {
// System.getProperty("file.separator") returnerer \ paa Windows  og / paa
// Unix/Linux
                String fnm = dir + System.getProperty("file.separator") + dirlist[i]; 
                if (new File(fnm).isFile())
                    result.add(new String(fnm));
                if (new File(fnm).isDirectory())
                    find(fnm, result);               
            }
        }
    }




    private class Filter implements FilenameFilter{
        public Filter(){
        }
       
        public boolean accept(File dir, String name) {
            if(name.endsWith(".dat"))
                return true;
           
            return false;
        }
    }
   
}
Avatar billede _carsten Nybegynder
06. juni 2006 - 22:18 #2
Ellers selvfølgelig bare implementere FilenameFilter

import java.io.File;
import java.io.FilenameFilter
import java.util.LinkedList;
import java.util.List;

public class FileHandler implements FilenameFilter{{
    public FileHandler() {
    }

    public List findFiles(String path, boolean showOnlyFiles) {
        List fileList = new LinkedList();
        find(path, fileList);
        return fileList;
    }

    private void find(String path, List result) {
        File dir = new File(path);
        String[] dirlist = dir.list( this );    // HER
        if(dirlist != null) {
            for (int i = 0; i < dirlist.length; i++) {
// System.getProperty("file.separator") returnerer \ paa Windows  og / paa
// Unix/Linux
                String fnm = dir + System.getProperty("file.separator") + dirlist[i]; 
                if (new File(fnm).isFile())
                    result.add(new String(fnm));
                if (new File(fnm).isDirectory())
                    find(fnm, result);               
            }
        }
    }



        public boolean accept(File dir, String name) {
            if(name.endsWith(".dat"))
                return true;
           
            return false;
        }
   
}
Avatar billede arne_v Ekspert
06. juni 2006 - 22:42 #3
lidt ide til indmaden i accept:

import java.util.regex.*;

public class Wildcard {
    public static boolean match(String pat, String s){
        String regex = "^" + pat.replaceAll("\\.", "\\.").replaceAll("\\*", ".*?") + "$";
        return Pattern.compile(regex).matcher(s).matches();
    }
    public static void main(String[] args) {
        System.out.println(match("a*.dat", "abc.dat"));
        System.out.println(match("a*.dat", "xyz.dat"));
        System.out.println(match("a*.dat", "abc.d"));
        System.out.println(match("a*.dat", "xabc.dat"));
    }
}
Avatar billede dl Nybegynder
07. juni 2006 - 12:44 #4
tak for de gode svar.

carsten indtil vidre har jeg brugt din løsning.. da den på nuværende tidspunkt klar mit problem. så kom med et svar.

arne_v, hvor mange år har du kode :P tror ikke selv jeg var kommet på med den løsning :D ( dit svar er dog ikke brugt, men godt at have er det )
Avatar billede _carsten Nybegynder
07. juni 2006 - 20:10 #5
Som Arne skriver, hvis du kombinerer mine og Arne's kom. har du faktisk det perfekte svar på dit spørgsmål, så en point deling ville være fornuftig.


public class Test(){
    public static void main(String[] args) {
                new Test();
        new FileHandler( "*.dat" );
    }
}



import java.io.File;
import java.io.FilenameFilter
import java.util.LinkedList;
import java.util.List;

public class FileHandler implements FilenameFilter{{
    public FileHandler() {
    }

    public FileHandler(String extension) {
        this.ext = extension;
    }

    public List findFiles(String path, boolean showOnlyFiles) {
        List fileList = new LinkedList();
        find(path, fileList);
        return fileList;
    }

    private void find(String path, List result) {
        File dir = new File(path);
        String[] dirlist = dir.list( this );    // HER
        if(dirlist != null) {
            for (int i = 0; i < dirlist.length; i++) {
                // System.getProperty("file.separator") returnerer \ paa Windows  og / paa
                // Unix/Linux
                String fnm = dir + System.getProperty("file.separator") + dirlist[i]; 
                if (new File(fnm).isFile())
                    result.add(new String(fnm));
                if (new File(fnm).isDirectory())
                    find(fnm, result);               
            }
        }
    }



    public boolean accept(File dir, String name) {
        return match(ext, name);
    }
   
   
    private boolean match(String pat, String s){
        String regex = "^" + pat.replaceAll("\\.", "\\.").replaceAll("\\*", ".*?") + "$";
        return Pattern.compile(regex).matcher(s).matches();
    }
   
    private String ext = "*";
}
Avatar billede dl Nybegynder
07. juni 2006 - 20:27 #6
hvis du vil det, så gør jeg det ... det er mere at jeg kun har brugt dit svar.
men nuvel :)

arne  kom med et svar også.
Avatar billede arne_v Ekspert
08. juni 2006 - 15:42 #7
giv du bare alle point til Carsten

han svarede paa dit spoergsmaal

jeg udvidede bare lidt for de tilfaelde hvor de er en generel wildcard
udtryk og ikke extension
Avatar billede dl Nybegynder
09. juni 2006 - 13:44 #8
oki, alle point er så gået til carsten.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester