Dateispeichersystem

Status
Nicht offen für weitere Antworten.
N

NexXor

Gast
Hallo Leute!

Also ich habe wieder ein Problem. Ich habe ein GUI mit mehreren Textfields. Ein Textfield ist die ID (kann der User nicht bearbeiten). Der Text der Textfields sollen in eine Datei gespeichert werden (1.dat). Doch der Dateiname muss gleich sein, wie die ID. Das heisst, der User gibt Text in die Textfields ein und klickt auf den Button speichern, dann muss das Speicherverzeichnis (vorgegeben) durchsucht werden (bei 1.dat anfangen), bis eine freie Zahl kommt, dann mussdie ID eingetragen werden und alles in der x.dat abgespeichert werden.

Das abspeichern klappt soweit auch schon, das einzige Problem ist das "Durchsuchen" des Verzeichnisses. Ich dachte da an einen for-loop? Was meint ihr?

Grüsse
NexXor
 

The_S

Top Contributor
achja, stimmt. Retro ist IN! Schmeißt eure Schleifen über Bord und Back to the Basics! Goto for the Win :p
 
N

NexXor

Gast
Naja, ich wäre dankbar, wenn ihr mich ein bisschen "anschubsen" könntet :)
 

ARadauer

Top Contributor
Also du gehst her und erstellt dir ein File mit dem Pfad wo du suchst.
Dann hohls du dir über listFiles alle Datei Einträge.
Du Iterierst mit einer for Schleife über die Einträge.
in der Schleife überprüfst du die Datei Endung (getName())
dann Parst du d den rest des Namens und machst eine Integer Zahl daraus
du suchst dir das Maximum und fertig

ungefähr so:




Code:
import java.io.File;

public class FileTest {
	public static void main(String[] args) {
		File pfad = new File("C:\\test\\");
		File[] dateien = pfad.listFiles();
		int max = 0;
		for(int i = 0 ; i < dateien.length;i++){
			String name = dateien[i].getName();
			if(".dat".equals(name.substring(name.length()-4, name.length()))){
				int v = Integer.parseInt(name.substring(0, name.length()-4));
				if(v>max)
					max = v;
			}		
		}		
		System.out.println("neue id: "+(max+1));
	}
}
 

The_S

Top Contributor
Code:
for (int i = 0; i < dateienimverzeichnis; i++) { // <= for-schleife

oder wobei hast du Probleme?

[edit]@ARadauer wenn wir schon vorkauen, dann aber bitte auch net so umständlich/fehleranfällig ;) .

Ermittelt die nächste, höchste ID (selbes Resultat wie bei ARadauer):


Code:
	public int getNextID(File root) {
		
		File[] files = root.listFiles();
		Arrays.sort(files);
		for (int i = files.length - 1; i > -1; i--) {
			if (files[i].getName().toLowerCase().endsWith(".dat")) {
				return Integer.parseInt(files[i].getName().substring(0, files[i].getName().length() - 4)) + 1;
			}
		}
		return 0;
	}

Ermittelt die nächste, freie ID (also z. B. wenn die Datein 0.dat, 1.dat und 3.dat existieren, so wird 2.dat ermittelt)

Code:
	public int getFreeID(File root) {
		
		File[] files = root.listFiles();
		Arrays.sort(files);
		for (int i = 0; i < files.length; i++) {
			if (files[i].getName().toLowerCase().endsWith(".dat")) {
				if (Integer.parseInt(files[i].getName().substring(0, files[i].getName().length() - 4)) != i) {
					return i;
				}
			}
		}
		return getNextID(root);
	}

vermutlich kannst du dir das Arrays.sort auch sparen.

[edit2] OK, Arrays.sort brauchst du definitiv!

API hat gesagt.:
public File[] listFiles()

...

There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.
 
N

NexXor

Gast
Wow, vielen Danke Leute, ihr seid echt super! Ich denke ich nehme die Lösung, bei der die nächste freie ID genommen wird, da das am effizientesten ist. Danke nochmals!

Grüsse
 
G

Guest

Gast
Hobbit_Im_Blutrausch hat gesagt.:
achja, stimmt. Retro ist IN! Schmeißt eure Schleifen über Bord und Back to the Basics! Goto for the Win :p
Echte Programmierer haben keine Angst vor GOTO. ;)
 

The_S

Top Contributor
Eine 3. Alternative wäre

Code:
	public int getID(File root) {
		
		String rootDir = root.getAbsolutePath() + "/";
		for (int i = 0;; i++) {
			if (!new File(rootDir + i + ".dat").exists()) {
				return i;
			}
		}
	}

Geht aber nur unter Windows bzw. auch unter Unix, wenn du sicherstellen kannst, dass alle Dateien in diesem Verzeichnis mit einer kleinen Dateiendung "ausgestattet" sind. Solltest halt ausprobieren, was am schnellsten ist.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben