Dateinamen vervollständigen

Status
Nicht offen für weitere Antworten.

dexcs

Mitglied
Hallo
Ich habe zwei Variablen.
In der 1. Steht der Anfang eines Dateinamens.
In der 2. steht in welchem Ordner die datei liegt.

Wie kann ich die 1. Variable, sprich den Dateinamen vervollständigen. Ich finde hierzu nirgends was.
Einfach eine Funktion der ich beides übergebe und die mir den vollständigen Dateinamen zurückliefert.

Danke..

Max
 

The_S

Top Contributor
Hoff mal ich hab das jetzt richtig verstanden ...

Durchsuche den entsprechenden Ordner nach einer datei (schau dir dazu mal File und listFiles an) die mit dem Anfang von der Datei beginnt, die du suchst

Code:
startsWith(str);
 

dexcs

Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
Hoff mal ich hab das jetzt richtig verstanden ...

Durchsuche den entsprechenden Ordner nach einer datei (schau dir dazu mal File und listFiles an) die mit dem Anfang von der Datei beginnt, die du suchst

Code:
startsWith(str);

Ich habe das mal versucht aber nicht hinbekommen, hat mir einer ein Beispiel?

Und noch was. Woher bekommt ihr immer die Infos was für funktionen ihr für was verwenden müsst? Erfahrung???
 

The_S

Top Contributor
API, und mit der Zeit lernt man auch jede Menge ... :wink:

z. B. so:

[edit] Irgendwie kann ich dir net glauben, dass dus versucht hast, dein post kam nur 3 Minuten nach meinem ... :bloed: :noe:

[edit 2] probiers erstmal selber, wenn des net schaffst, kommt der Code evtl. auch wieder

[edit 3] Diese Links helfen dir:
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#listFiles()
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#getName()

btw: welch Farbenfreudiger post ... :wink:
 

MJA

Mitglied
Ich versuchs mal ;-)
Diese Funktion gibt den vollen Dateinamen zurück, falls der Anfang übereinstimmt. Wenn du aber als übergebenen String z.B "PICT" hast und du durchsuchst einen Ordner in dem die Dateien "PICT01.jpg", "PICT02.jpg", etc. vorhanden sind, bekommst du natürlich den erstebesten Dateinamen zurück. Wenn du alle darau zutreffenden Dateinamen haben willst musst du einen String[] zurückgeben. Du könntest, da du ja nicht weißt, auf wieviele Dateien es zutrifft, entweder alle Strings in einen Vector füllen und dann davon den Array zurückgeben lassen, oder du lässt vorher einen Zähler laufen und initialisierst den Rückgabe-Array dann mit dessen Endwert. Hier mal die (simple) allgemeine Fassung:

Code:
public String completeFileName(String startsWith, String folderPath){
		File folder = new File(folderPath);
		if(!folder.exists() || !folder.isDirectory())
			throw new IllegalArgumentException("invalid folder: " + folderPath);
		
		File[] filesInFolder = folder.listFiles();
		
		for(int i = 0; i < filesInFolder.length; i++)
			if(filesInFolder[i].getName().startsWith(startsWith))
				return filesInFolder[i].getName();
		
		return null;
	}

Ich hoffe, das funktioniert.

Sorry wegen Doppelpost, hatte ausversehen Enter gedrückt.

Gruß,
Jan.
 

Mag1c

Top Contributor
oder auch:

Code:
public class StartsWithFilenameFilter implements FilenameFilter {
    public StartsWithFilenameFilter (String _start) {
        start = _start;
    }
    boolean accept(File dir, String name) {
        return name.startsWith(start);
    }
    private String start;
}

    String[] list = dir.list(new StartsWithFilenameFilter(filename));

Falls das Dateinamenfragment bereits in einer Instanzvariable vorliegt und du den Filter als Inner-Class machst, kannst du den Konstruktor und die Variable start weglassen.

Gruß
Mag1c
 

dexcs

Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
API, und mit der Zeit lernt man auch jede Menge ... :wink:

z. B. so:

[edit] Irgendwie kann ich dir net glauben, dass dus versucht hast, dein post kam nur 3 Minuten nach meinem ... :bloed: :noe:

[edit 2] probiers erstmal selber, wenn des net schaffst, kommt der Code evtl. auch wieder

[edit 3] Diese Links helfen dir:
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#listFiles()
http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#getName()

btw: welch Farbenfreudiger post ... :wink:

Ich hab die Funktion schon gefunden bevor ich gepostet hatte.
http://www.galileocomputing.de/open...el_12_000.htm#Rxx365java12000040003DA1F0161F6
Das Problem war als ich das versucht hab umzusetzen es so viele Fehler gab das ich nach 1 Std. aufgebeben habe und hier fragte ob es net einfacher geht. Hab halt die Frage gestellt als ob ich grad damit anfang. War aber net so.
Trotzdem Danke.

Max
 

The_S

Top Contributor
Hm, ok. Dann nehme ich das natürlich zurück. Sags halt einfach nächstes mal gleich. Kommt auch gleich viel besser an, wenn du sagst, dass du schon mit den und den Klassen rumgearbeitet hast. :wink:
 

mischer

Aktives Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
Kommt auch gleich viel besser an, wenn du sagst, dass du schon mit den und den Klassen rumgearbeitet hast. :wink:

[klugscheiss]
Stimmt! Die Leute hier im Forum haben im Allgemeienen relativ wenig Lust auf Posts von der Sorte "Muss morgen Projekt abgeben und hab gerade Java installiert" zu antworten. Wenn du hingegen angibtst was du bereits versucht hast und wo du nicht weiter kommst wirst du wesentlich mehr Hilfe erwarten können.
[/Klugscheiss]

MfG
mischer
 

dexcs

Mitglied
Danke euch, und falls es jemand interessiert: Hier der komplette fertige Code:

Was würdet ihr da anderst machen, also er funktioniert aber was könnte man verbessern?

Code:
package engine;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.swing.JOptionPane;

public class start {

	/**
	 * @param args
	 */
	public static String InputFile;

	public static String SourceFolder;

	public static String SourceFolderComplete;

	public static String DestFolder;

	/*
	 * Funktion um jede einzelne Zeile aus der Datei mit den Dateinamen
	 * auszulesen.
	 */
	public static void readInputFile() throws FileNotFoundException {
		BufferedReader File = new BufferedReader(new FileReader(InputFile));
		try {
			String Line;
			while ((Line = File.readLine()) != null) {
				generateFolder(Line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/*
	 * Funktion um den Ordner aus dem Dateinamen zu generieren
	 */
	public static void generateFolder(String Line) {
		if (Line.length() < 8)
			Line = "00000000";
		String folder1 = Line.substring(0, 2);
		String folder2 = Line.substring(3, 5);
		String SourceFolderComplete = SourceFolder + folder1 + "\\" + folder2
				+ "\\";
		String Filename = completeFileName(Line, SourceFolderComplete);
		try {
			if (Filename == null) {
				logFile("Datei nicht gefunden: " + SourceFolderComplete
						+ Line);
			} else {
				copy(SourceFolderComplete + Filename, DestFolder + Filename);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/*
	 * Funktion um zwei Dateien zu Kopieren
	 */
	public static void copy(String src, String dest) throws IOException {
		byte[] buffer = new byte[1024];
		InputStream in = null;
		try {
			in = new FileInputStream(src);
		} catch (FileNotFoundException e) {
		}
		OutputStream out = null;
		try {
			out = new FileOutputStream(dest);
			logFile("File or directory copied: " + dest);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		for (int n; (n = in.read(buffer)) != -1; out.write(buffer, 0, n))
			;
		in.close();
		out.close();
	}

	/*
	 * Funktion um den Dateinamen zu vervollständigen
	 */
	public static String completeFileName(String startsWith, String folderPath) {
		File folder = new File(folderPath);
		if (!folder.exists() || !folder.isDirectory()) {

			logFile("Ordner existiert nicht: " + folderPath);
		} else {

			File[] filesInFolder = folder.listFiles();

			for (int i = 0; i < filesInFolder.length; i++)
				if (filesInFolder[i].getName().startsWith(startsWith))
					return filesInFolder[i].getName();
		}
		return null;
	}
	/*
	 * Funktion zum mitloggen der Aktionen in einer Datei
	 */
	public static void logFile(String log) {
		PrintWriter writer = null;
		try {
			writer = new PrintWriter(new FileWriter(DestFolder + "logfile.txt",
					true));
		} catch (IOException e) {
			e.printStackTrace();
		}
		writer.println(log);
		writer.flush();
		writer.close();
	}
	/*
	 * Funktion um die globalen Variablen per Benutzereingabe zu füllen
	 */
	public static void messages() {
		InputFile = JOptionPane.showInputDialog("Gib die ASCII File an:");
		if (InputFile.length() < 2) {
			JOptionPane.showMessageDialog(null, "Kein ASCII File angegeben - Abbruch!");
			System.exit(0);
		}
		SourceFolder = JOptionPane
				.showInputDialog("Gib den Ordner an in dem die CAD Dateien liegen:");
		if (SourceFolder.length() < 2) {
			JOptionPane.showMessageDialog(null, "Kein CAD Verzeichniss angegeben - Abbruch!");
			System.exit(0);
		}
		DestFolder = JOptionPane
				.showInputDialog("Gib den Ordner an in den die Dateien kopiert werden:");
		if (DestFolder.length() < 2){
			JOptionPane.showMessageDialog(null, "Kein Ordner fürs Kopieren angegeben - Abbruch!");
			System.exit(0);
		}
		
		JOptionPane.showMessageDialog(null,
				"Alles Klar! Ich Lege Los... Bitte warten bis ich mich wieder melde!");		
	}
	/*
	 * Hauptfunktion 
	 */
	public static void main(String[] args) throws FileNotFoundException {
		messages();
		readInputFile();
		JOptionPane.showMessageDialog(null, "Fertig!");
		System.exit(0);
	}

}
 

MJA

Mitglied
Ich würde des ganze OO schreiben, also die ganzen Methoden nur public und nicht static machen und dann in main() den Konstruktor aufrufen. Das hat zwar jetzt so keinen direkten Vorteil, aber dann lässt sich das Modul auch gut später mal in andere Programme einbauen, etc.
Außerdem Fehlerverarbeitung mit try und catch => Benutzerfreundlichkeit ;-)
Die Variablennamen sind alle groß, laut Java-Konventionen sollen diese aber klein sein, damit man sie von einem Typen unterscheiden kann und normalerweise sollten sie private sein. Einige Funktionen werden vermutlich auch nur von dieser einen Klasse verwendet, also ruhig private machen.
Hier hast du nicht platformunabhängigen Code verwendet:
Code:
String SourceFolderComplete = SourceFolder + folder1 + "\\" + folder2
            + "\\";
Das lässt sich einfach verhindern. Das Dateitrennzeichen des jeweiligen Systems ist immer in der Property "file.separator" gespeichert. Aufrufbar folgendermaßen:
Code:
System.getProperty("file.separator");
Also:
Code:
String SourceFolderComplete = SourceFolder + folder1 + System.getProperty("file.separator") + folder2
            + System.getProperty("file.separator");

Naja, sind aber alles nur Kleinigkeiten, die nichts wesentliches verändern.

Gruß,
Jan.
 
N

na-oma

Gast
statt
Code:
System.getProperty("file.separator")
kann man auch
Code:
File.separatorChar

Weiss einer ob eine Lösung sauberer ist?
 

Bleiglanz

Gesperrter Benutzer
Code:
   public static String SourceFolderComplete;
kannst du löschen, brauchst du nicht - überschreibst du später versehendlich :)

Code:
   public static void copy(String src, String dest) throws IOException {
      byte[] buffer = new byte[1024];
      InputStream in = null;
      try {
         in = new FileInputStream(src);
      } catch (FileNotFoundException e) {
      }
      OutputStream out = null;
      try {
         out = new FileOutputStream(dest);
         logFile("File or directory copied: " + dest);
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      }
catche sind sinnlos / falsch, weil durch die throws schon abgedeckt, und seltsam, dass die Erfolgsmeldung vor dem Beginn des Kopierens ins logfile wandert :)
 
O

ousn

Gast
moinmoin

Eigendlich etwas ganz einfaches, aber habs net hingebracht:
Ich will nur den namen (in diesem Fall test.txt) des Files herausfinden:

Code:
....
//  read of file
    FileInputStream out = new FileInputStream("test.txt");
    DataInputStream in = new DataInputStream(out);

//get name of File -- test.txt
    String name = out.getName();
    System.out.println("Name of file: "+name);
....

Code funzd ned...

mfg ousn
 

The_S

Top Contributor
Versuchs so:

Code:
File file = new File("test.txt");
String str = file.getName();
 
S

SlaterB

Gast
dann könnte man ja auch gleich folgendes schreiben
Code:
//  read of file
    String name = "test.txt";
    FileInputStream out = new FileInputStream(name);
    DataInputStream in = new DataInputStream(out);

//get name of File -- test.txt
    System.out.println("Name of file: "+name);

sieht jedenfalls so aus als wenn man aus dem Stream nicht den Dateinamen bekommt,
da musst du ihn wohl separat speichern.. (als String/ File/ in einer eigenen Unterklasse von FileInputStream..)

ziemlich aufwendig, vielleicht hat noch jemand ne Lösung ;)
 
O

ousn

Gast
Danke viel mals...
und ich habe die ganze Zeit versucht aus dem Stream den Dateinamen zu bekommt.
Geht wohl wirklich net.
Ja dann mach ichs so wie ihrs vorgeschlagen habt, geht ja auch ;D


Schönen tach noch und danke nochmals
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
NightmareVirus Java-Editor (G. Röhner): Fehlende Dateinamen Java Basics - Anfänger-Themen 1
it_is_all For-Schleife - Dateinamen fortlaufende Nummer Java Basics - Anfänger-Themen 2
R Input/Output Dateinamen aus Verzeichnis in Datei schreiben Java Basics - Anfänger-Themen 3
H nio Pfad aus Dateinamen extrahieren Java Basics - Anfänger-Themen 4
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
L String wird nicht gespeichert / Probleme mit Dateinamen Java Basics - Anfänger-Themen 9
K Spezialzeichen in Dateinamen Java Basics - Anfänger-Themen 2
M Fileoutputstream: Linux Dateinamen mit Umlaute Java Basics - Anfänger-Themen 4
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
E Erste Schritte Verzeichnis auslesen, Dateinamen in Array speichern :-( Java Basics - Anfänger-Themen 7
S JFileChooser - Dateinamen vorschlagen/Inhalt der Ausgabe prüfen Java Basics - Anfänger-Themen 3
N JComboBox mit Dateinamen befüllen Java Basics - Anfänger-Themen 7
S Dateinamen in txt einfügen Java Basics - Anfänger-Themen 2
StrikeTom Wie ermittel ich alle dateinamen in einem Ordner Java Basics - Anfänger-Themen 2
C0FFEE Anwendung soll eigenen Dateinamen referenzieren Java Basics - Anfänger-Themen 13
M Filtern von Dateinamen Java Basics - Anfänger-Themen 7
F Dateinamen auslesen und in File speichern! Java Basics - Anfänger-Themen 3
J Dateinamen umbennen Java Basics - Anfänger-Themen 4
I viele Dateinamen in ein String-Array mit File().list() Java Basics - Anfänger-Themen 4
W Dateinamen einlesen und Liste in .txt-Datei ausgeben. Java Basics - Anfänger-Themen 2
J Dateinamen für Download ändern! Java Basics - Anfänger-Themen 3
C Dateinamen Filtern Java Basics - Anfänger-Themen 10
O JFileChooser Filter an Dateinamen hängen Java Basics - Anfänger-Themen 4
L Klassen und Dateinamen Java Basics - Anfänger-Themen 7
A Dateinamen mit laufender Nummer erzeugen! Wie? Java Basics - Anfänger-Themen 9
N Eindeutige Dateinamen generieren Java Basics - Anfänger-Themen 17
G Alle Dateinamen in ein Choice ausgeben Java Basics - Anfänger-Themen 2
M Leerzeichen in Dateinamen ein Problem ? Java Basics - Anfänger-Themen 4
G Dateinamen aus einem Verzeichnis ausgeben Java Basics - Anfänger-Themen 3
G Dateinamen ohne Endung ausgeben Java Basics - Anfänger-Themen 4
J Dateinamen ermitteln Java Basics - Anfänger-Themen 3
Arita welche Fehler gibt es noch? wie kann ich es noch vervollständigen Java Basics - Anfänger-Themen 15
D Erste Schritte Methoden vervollständigen Java Basics - Anfänger-Themen 15
V Klasse vervollständigen Java Basics - Anfänger-Themen 11
X Eigenes Kontosystem vervollständigen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben