Avatar billede warpgiga Nybegynder
09. oktober 2001 - 14:34 Der er 28 kommentarer og
1 løsning

Analyse af fil-struktur

Hej gæve kodere! ;)

Jeg har brug for noget kode der kan læse og outputte filstrukturen fra en given path på serveren, f.eks /img/.
Jeg skal kunne outputte en listing af den på en jsp side.. Bemærk den skal være rekursiv, og vise både filer og mapper.

Al hjælp, er go hjælp ;)
Avatar billede disky Nybegynder
09. oktober 2001 - 14:55 #1
Dette program scanner rekursivt din HD ud fra en given path.

Du må selv lige pakke den ind i en JSP. Men det er metoden scan(file) som laver magien.

Du kan også få mere info ud hvis du ønsker det, ligesom navn bliver hentet med .getName()


/*
    * Dir.java
      *
      * Created on 9. oktober 2001, 14:49
      */
import java.io.*;

/**
*
* @author  srr
* @version
*/
public class Dir extends Object
{
    /** Creates new Dir */
    public Dir()
    {
        scan(new File(\"c:\\\\\"));
       
    }
   
    private void scan(File file)
    {
        File files[]=file.listFiles();
       
        String name;
        String type;

        for (int x=0; x<files.length; x++)
        {
            if(files[x].isDirectory())
            {
                scan(files[x]);
            }

            name=files[x].getName();
            System.out.println(\"name = \"+name);
           
        }
    }
   
    /**
    * @param args the command line arguments
    */
    public static void main (String args[])
    {
        new Dir();
    }
   
}
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:04 #2
Hey Disky ;) takker, det ser fint ud..
Hvordan ville du pakke det ind? i en servlet?
eller direkte i jsp\'en? gider du evt. lave den til en servlet for mig? så kan jeg bedre fatte hvordan man konverter imellem disse? Det ville hjælpe mig en hel del.
Avatar billede disky Nybegynder
09. oktober 2001 - 15:12 #3
hvis du bruger jsp ville det være mere fornuftigt at bruge en Bean istedet.

Jeg kan godt lige prøve at smide noget sammen
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:14 #4
ok,.. fedest. venter i spænding ;) .. Fini
Avatar billede disky Nybegynder
09. oktober 2001 - 15:14 #5
er det ok ?
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:15 #6
fedest, jeg venter i spænding ;) Fini
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:16 #7
jeg kom til at trykke accept istedet for send før ;) he
jeg vil meget gerne at du \"smider\" noget sammen ;)
Avatar billede disky Nybegynder
09. oktober 2001 - 15:18 #8
bare rolig jeg er næsten færdig
Avatar billede disky Nybegynder
09. oktober 2001 - 15:30 #9
først kommer JSP siden:

<jsp:useBean id=\"dir\" scope=\"request\" class=\"Dir\" />
<jsp:setProperty name=\"dir\" property=\"*\"/>
<%

dir.scan(new java.io.File(\"c:\\\\jdk1.3.1\\\\\"));

for(dir.dataInit();dir.hasNextRow();dir.getNextRow())
{

%>
FileName=<%=dir.getName()%><br>
<%
}
%>
Avatar billede disky Nybegynder
09. oktober 2001 - 15:31 #10
og her er bønnen

/*
    * Dir.java
      *
      * Created on 9. oktober 2001, 14:49
      */
import java.io.*;
import java.util.*;
/**
*
* @author  srr
* @version
*/
public class Dir extends Object
{
    String name;
   
    ArrayList liste;
    Iterator iter;
   
    /** Creates new Dir */
    public Dir()
    {
        liste=new ArrayList();
    }
   
    public void scan(File file)
    {

        File files[]=file.listFiles();
       
        String name;

        for (int x=0; x<files.length; x++)
        {
            if(files[x].isDirectory())
            {
                scan(files[x]);
            }

            name=files[x].getName();

            liste.add(name);
        }
    }
   
    public String getName()
    {
        return name;
    }
   
    public void dataInit()
    {
        iter=liste.iterator();
    }
   
    public boolean hasNextRow()
    {
        if(iter.hasNext())
        {
            name=(String)iter.next();
            return true;
        }
        return false;
    }

    public void getNextRow()
    {
    }
   
}
Avatar billede erikjacobsen Ekspert
09. oktober 2001 - 15:34 #11
Skal man undgå at blande directories og filer - altså prøve at få alle filer
i samme katalog til at stå ved siden af hinanden - kan man bruge dette lille
trick (bemærk: ingen rekursion). Det er dig ikke en bønne:

import java.io.*;
import java.util.*;

public class DirectoryListing  {
  public static void main(String arg[]) {
    LinkedList stak = new LinkedList();
    File thisdir;
    stak.add(new File(\"C:/\"));

    while (stak.size()>0) {
      thisdir=(File)stak.removeLast();
      System.out.println(\"Directory: \"+thisdir.getAbsolutePath());
      File files[]=thisdir.listFiles();
      for (int x=0; x<files.length; x++) {
        if(files[x].isDirectory()) {
          stak.add(files[x]);
        } else {
          System.out.println(\"  \"+files[x].getName());
        }
      }
    }
  }
}
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:36 #12
yeah! Det ser rigtig smooth ud! glæder mig til at bruge det ;)

p.s. hvordan skelner man mellem folders og files??
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:38 #13
Erikjacobsen: ja det var lige det mit seneste spørgsmål til Disky gik ud på ;) he he.. tak for dit input ;)
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:40 #14
Ok, det var måske \"lidt\" upreciseret i mit oprindelige spørgsmål, men jeg skal bruge det til at outputte noget js-kode som opretter en node struktur magen til fil-strukturen, derfor er det vigtigt at vide precist hvordan filerne er placeret i de respektive mapper.. ;)
Avatar billede disky Nybegynder
09. oktober 2001 - 15:42 #15
inde i
            if(files[x].isDirectory())
            {
                scan(files[x]);
            }

kan du gøre noget specielt hvis vi er landet i en directory.
Avatar billede erikjacobsen Ekspert
09. oktober 2001 - 15:44 #16
Nå, ok, det er nu første gang jeg laver det nummer i Java. En \"system volume
information\" fil bliver opfattet som et katalog, men en null-pointerfejl til følge.
Det er kun et problem hvis man starter i roden af en disk, og sikkert kun under
Windows. Men dette er altså et lille nummer mere stabilt:

import java.io.*;
import java.util.*;

public class DirectoryListing  {
  public static void main(String arg[]) {
    LinkedList stak = new LinkedList();
    File thisdir;
    stak.add(new File(\"C:/\"));

    while (stak.size()>0) {
      thisdir=(File)stak.removeLast();
      System.out.println(\"Directory: \"+thisdir.getAbsolutePath());
      File files[]=thisdir.listFiles();
      if (files!=null) {
        for (int x=0; x<files.length; x++) {
          if(files[x].isDirectory()) {
            stak.add(files[x]);
          } else if (files[x].isFile()) {
            System.out.println(\"  \"+files[x].getName());
          }
        }
      }
    }
  }
}
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:45 #17
Disky: oh yeah.. sad lige og lurede det ;) dejligt..
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:49 #18
Erikjacobsen:  ok ;) Den kan også nemt laves rekursiv ;o)
Avatar billede erikjacobsen Ekspert
09. oktober 2001 - 15:55 #19
Kan den det, warpgiga? Hvorfor? Du får problemer med at holde
filer sammen i samme katalog, hvis der dukker kataloger op ind
imellem.
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 15:56 #20
ja klart.. men jeg mener den kan godt bruges rekursivt så man kan få hele træet right? ;)
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 17:06 #21
Hej igen ;)

Disky: Jeg sidder med dit eksempel, men har lidt problemer, da man ikke umiddelbart kan tjekke om det er en parent mappe, eller en ny mappe i længere nede i strukturen..

her er min test struktur:

C:\\test\\Mappe 1
C:\\test\\Mappe 2
C:\\test\\readme.txt
C:\\test\\Mappe 1\\Mappe 1-1
C:\\test\\Mappe 1\\readme1.txt
C:\\test\\Mappe 1\\Mappe 1-1\\readme1-1.txt
C:\\test\\Mappe 2\\readme2.txt

--

her er det output jeg får indtil nu..:

fTree.addNode(null, \'root\', \'c:\\test\\\', \'\');
fTree.addNode(\'root\',\'1\',\'Mappe 1/\');
fTree.addNode(\'1\',\'2\',\'Mappe 1-1/\');
fTree.addNode(\'2\',\'3\',\'readme1-1.txt\');
fTree.addNode(\'2\',\'4\',\'readme1.txt\');
fTree.addNode(\'2\',\'5\',\'Mappe 2/\');
fTree.addNode(\'5\',\'6\',\'readme2.txt\');
fTree.addNode(\'5\',\'7\',\'readme.txt\');

- Syntax: addNode(parentNodeId, NodeId, nodeName)

problemet er f.eks at Mappe 2 skal have parent=0, men den får parent=2, da den ikke ved at den tilhører root (0)...

Det burde kunne løses ved lave beanen om så man fra jsp\'en kunne lave en mappe løkke med en fil løkke indeni ;)
istedet for som nu, hvor det er en løkke...

Avatar billede warpgiga Nybegynder
09. oktober 2001 - 17:08 #22
note: har modificeret beanen, så den tilføjer et \"/\" i enden af en mappe, så jeg kunne kende forskel på filer og mapper.

        for (int x=0; x<files.length; x++)
        {
            if(files[x].isDirectory())
            {
                name=files[x].getName() + \"/\";
                liste.add(name);
                scan(files[x]);
               
            }
            else {
                name=files[x].getName();
                  liste.add(name);
            }
   
        }
Avatar billede erikjacobsen Ekspert
09. oktober 2001 - 19:53 #23
Jah, warpgiga. Det er jo det jeg løser med min metode. Du får skam hele
træet, selv om metoden ikke er rekursiv.
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 19:59 #24
he he ;) ja.. Det er to slags rekursiv vi har talt forbi hinanden omkring.. rekursiv funktion, og rekursiv listing..
;)

Jeg kunne godt bruge din kode, men jeg skal bruge den som en bean, eller lign.. (please ;)
Avatar billede erikjacobsen Ekspert
09. oktober 2001 - 20:05 #25
Er det ikke bare at lave en lille sjov kombination af diskys bønne og
min kode? (...har ikke lige tid...)
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 20:09 #26
ok ;) - Du behøver ikke at haste, men det ville være en god bønne at have ;) -  jeg sidder med noget af et hack af Diskys bean/jsp, og det virker tilsyneladene, jeg bruger rest-pathen som id, og får dermed parent kontrol:

fTree.addNode(null, \'root\', \'c:\\test\\\', \'\');
fTree.addNode(\'c:\\test\\\',\'1\',\'Mappe1\\\');
fTree.addNode(\'c:\\test\\Mappe1\\\',\'2\',\'Mappe1-1\\\');
fTree.addNode(\'c:\\test\\Mappe1\\Mappe1-1\\\',\'3\',\'readme1-1.txt\');
fTree.addNode(\'c:\\test\\Mappe1\\\',\'4\',\'readme1.txt\');
fTree.addNode(\'c:\\test\\\',\'5\',\'Mappe2\\\');
fTree.addNode(\'c:\\test\\Mappe2\\\',\'6\',\'readme2.txt\');
fTree.addNode(\'c:\\test\\\',\'7\',\'readme.txt\');
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 20:14 #27
Jeg er som altid, mega imponeret af jeres indsats ;)
- This Community Rocks! - You Guys Rock!!!
Avatar billede warpgiga Nybegynder
09. oktober 2001 - 20:28 #28
og her det er helt færdige træ:

fTree.addNode(null, \'root\', \'Images\', \'\');
fTree.addNode(\'root\', \'c:\\test\\\', \'c:\\test\\\', \'\');
fTree.addNode(\'c:\\test\\\',\'1\',\'Mappe1\\\',\'/edit_image.jsp?path=c%3A%5Ctest%5CMappe1%5C\');
fTree.addNode(\'c:\\test\\Mappe1\\\',\'2\',\'Mappe1-1\\\',\'/edit_image.jsp?path=c%3A%5Ctest%5CMappe1%5CMappe1-1%5C\');
fTree.addNode(\'c:\\test\\Mappe1\\Mappe1-1\\\',\'3\',\'readme1-1.txt\',\'/edit_image.jsp?path=c%3A%5Ctest%5CMappe1%5CMappe1-1%5Creadme1-1.txt\');
fTree.addNode(\'c:\\test\\Mappe1\\\',\'4\',\'readme1.txt\',\'/edit_image.jsp?path=c%3A%5Ctest%5CMappe1%5Creadme1.txt\');
fTree.addNode(\'c:\\test\\\',\'5\',\'Mappe2\\\',\'/edit_image.jsp?path=c%3A%5Ctest%5CMappe2%5C\');
fTree.addNode(\'c:\\test\\Mappe2\\\',\'6\',\'readme2.txt\',\'/edit_image.jsp?path=c%3A%5Ctest%5CMappe2%5Creadme2.txt\');
fTree.addNode(\'c:\\test\\\',\'7\',\'readme.txt\',\'/edit_image.jsp?path=c%3A%5Ctest%5Creadme.txt\');
Avatar billede erikjacobsen Ekspert
09. oktober 2001 - 20:51 #29
Smart hack :)
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