Gå til innhold

Hvordan traversere mapper?


Anbefalte innlegg

Jeg må spørre igjen, jeg. Er ikke helt stø i dette her. :p

 

Jeg vil gå igjennom alle undermapper i en gitt mappe, og prosessere alle filer under hver undermappe.

 

Jeg har prøvd på følgende:

public static void main(String[] args) { 


String mappe = "data"; //mappen som skal leses
File dir = new File(mappe); 
String[] list = dir.list();
for (String t: list) { 
  File inn = new File(t); 
  System.out.println(mappe+t); //bare for å se at jeg har rett mappe og undermapper

  if(inn.isDirectory()) 
   { 
      processDir(mappe, t);
    }
}

}

Men det ser ikke ut til å fungere.

Er det også riktig måte å sende mappereferanser videre på?

Målet er at metoden processDir skal kalles med referanse til mappe og undermappe, og så prosessere alle filer under undermappe.

 

Jeg er helt java-fersk, og prøver ut ting på egenhånd her. :)

Lenke til kommentar
Videoannonse
Annonse

dir.list() fra J2SE API'en:

"Returns an array of strings naming the files and directories in the directory denoted by this abstract pathname."

 

Så, dersom du har en katalog "data\nils", så vil tilsvarende element i arrayet fra dir.list være "nils". Når du da oppretter et nytt File-objekt, og sender med strengen, så blir det tolket som "nils" i current-katalogen, istedet for "data\nils".

Om du skifter ut File inn = new File(t);

med

File inn = new File(mappe,t);

så burde det funke. (Tror jeg.. uten å ha testet det... ;))

Lenke til kommentar
import java.io.File;

public class Traverse {

public Traverse() {
}

public void traverse(File dir) {

 for(File file : dir.listFiles()) {
 	//File file = new File(dir.getAbsolutePath() + File.separator + fileName);
 	System.out.println(file);
 	
 	if(file.isDirectory()) {
   traverse(file);
 	}
 }
}

public static void main(String[] args) {
 Traverse t = new Traverse();
 File file = new File("/home/monkey");
 t.traverse(file);
}
}

Endret av krigun
Lenke til kommentar

Jeg personlig ville styrt unna rekursjon i Java, med en stor (les: dyp) katalogstruktur, risikerer du stack overflow. Jeg ville istedet gjort dette med en kø. I eksempelet under bruker jeg en først inn, først ut-kø, forkortet til FIFO på engelsk.

 

Dette skulle tilsvare et bredde-først søk/traversering i treet. Du kan eventuelt bruke en LIFO kø, sist inn, sist ut, også kjent som en stack, eller tallerkenstabelmodellen.

 

import java.io.File;
import java.util.ArrayList;

public class Traverser {

public Traverser() {
}

public void traverse(File dir) {
 ArrayList<File> queue= new ArrayList<File>();	
 queue.add(dir);
 
 while (!queue.isEmpty()) { //traverserer katalog-køen
 	dir = queue.get(0); // henter fremste katalog i køen
 	for(File file : dir.listFiles()) {  	
   System.out.println(file);
  
   if(file.isDirectory()) queue.add(file); // legger til funnet mappe i katalog-køen
 	}
 	
 }    
 }


public static void main(String[] args) {
Traverser t = new Traverser();
File file = new File("/home/monkey");
t.traverse(file);
}
}

Lenke til kommentar

import java.io.File;

public class Traverse {

public Traverse() {
}

public void traverse(File dir) {

for(File file : dir.listFiles()) {
 //File file = new File(dir.getAbsolutePath() + File.separator + fileName);
 System.out.println(file);

 if(file.isDirectory()) {
  traverse(file);
 }
}
}

public static void main(String[] args) {
Traverse t = new Traverse();
File file = new File("/home/monkey");
t.traverse(file);
}
}

 

Det funket!! :D

Med litt modifikasjoner for å passe inn i min kode.

Tusen takk! Brilliant. :thumbup:

Endret av El Viking
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...