Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: Tiedostolistaus rekursiivisesti

Sami [02.02.2005 15:03:50]

#

Ohjelma listaa kaikki annetun kansion tiedostot ja tulostaa tiedostolistauksen tiedostoon C:/filelist.txt.

Valmiiksi käännetyn luokan voi hakea http://www.paivola.fi/~sami/java/FileLister/FileLister.class

Käyttö: java Filelister [kansio]
Jos kansiota ei ole annettu, niin listaus tehdään siitä kansiosta, missä ajettava tiedosto on.

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

public class FileLister {

	public static void main(String[] args) {
		long alkuaika = System.currentTimeMillis();

		//Jos ohjelmalle on annettu parametriksi jotain, niin tehdään tiedostolistaus annetusta kansiosta
		//muuten tehdään listaus siitä kansiosta, missä tiedosto ajetaan...
		String folder;
		if (args.length == 0) folder = "."; else folder = args[0];

		//Aloitetaan tiedostojen hakeminen
		Vector fileList = listFiles(new File(folder), new Vector());

		//Lopuksi tulostetaan tiedostolistaus (+ tiedostojen koko) tiedostoon C:/filelist.txt
		//Tulostustiedostoksi voi myös muuttaa esim. folder + "/filelist.txt", jos haluaa tiedostolistauksen
		//siihen kansioon, minkä tiedostolistauksen teki.
		//Lasketaan samalla myös tiedostojen yhteiskoko
		long size = 0;
		try {
			BufferedWriter output = new BufferedWriter(new FileWriter("C:/filelist.txt"));

			for (int i = fileList.size()-1; i > 0; --i) {
				File file = (File)(fileList.get(i));
				output.write(file.getAbsolutePath() + "\t" +
						file.length() + "\r\n");

				size += file.length();
			}

			output.close();
		} catch (IOException e) {
		}

		System.out.println("Tiedostoja ja kansioita yhteensä: " + fileList.size());
		System.out.println("Tiedostojen koko yhteensä: " + size + " B");
		System.out.println("Tiedostojen koko yhteensä: " + size / Math.pow(2, 20) + " MB");
		long loppuaika = System.currentTimeMillis();
		System.out.println("Listaaminen kesti " + (loppuaika-alkuaika) + " ms");
	}

	public static Vector listFiles(File folder, Vector fileList) {
		File[] files;
		File[] folders;
		try {
			File dir = new File(folder.getPath());

			//Haetaan kansion tiedosto- ja kansiolistaus
			files = dir.listFiles();

			//Otetaan kaikki kansiot erilliseen muuttujaan
		    FileFilter fileFilter = new FileFilter() {
		        public boolean accept(File file) {
		            return file.isDirectory();
		        }
		    };

			folders = dir.listFiles(fileFilter);

			//Lisätään tiedostot ja kansiot vektoriin
			for (int i = 0; i < files.length; i++) {
				fileList.add(files[i]);
			}

			//Kutsutaan metodia uudestaan jokaiselle löydetylle kansiolle
			for (int i = 0; i < folders.length; i++) {
				listFiles(folders[i], fileList);
			}
		} catch (Exception e) {
			System.out.println("Joku homma kusahti vähän...");
			e.printStackTrace();
		}

		//Lopuksi palautetaan löytyneiden kansioiden ja tiedostojen lista.
		return fileList;
	}
}

Linkku [03.02.2005 14:17:47]

#

Vähän huono tallentaa oletuksena paikkaan "C:", jos on Linux tai Macintosh käytössä.

lainaus:

Joku homma kusahti vähän...
java.lang.NullPointerException
at FileLister.listFiles(FileLister.java:63)
at FileLister.main(FileLister.java:15)

Sami [04.02.2005 03:13:20]

#

joo... Käännetystä versiosta se on vähän hankalampi muuttaa, mutta sorsasta ei pitäisi olla kovin hankalaa :)
Lähinnä se on C:/ sen takia, että en halunnut koneeltani löytyvän pariakymmentä filelist.txt:tä ympäriinsä siroteltuina, kun kokeilin tuon toimivuutta tuollaisenaan ja vähän muuteltuna aika monessa eri kansiossa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta