# JFileChooser - erkennen v. existierenden Dateien ohne Endung



## Guest (11. Dez 2008)

Hallo zusammen,

ich habe mir eine Klasse erstellt, die vom JFileChooser abgeleitet ist und die "approveSelection" Methode überschreibt, damit bei bestehenden Dateien nachgefragt wird, ob diese überschrieben werden soll, oder nicht.


```
@Override
	public void approveSelection() {
		File f = getSelectedFile();
		
		if (f.exists()) {
			showOverWriteConfirmDialog();
                }
```

Funktioniert auch alles bestens:
Wenn der FileChooser hochpoppt und ich eine bereits existierende Datei auswähle, werde ich nach Betätigung des "ok-Buttons" gefragt, ob die Datei überschrieben werden soll.
Da der FileChooser nur .pdf oder .txt Dateien schreiben soll, ist zusätzlich noch ein FileFilter für die beiden Dateitypen implementiert. Wird z.B. im FileChooser als Dateityp "pdf" und als Dateiname "test" ausgewählt, wird die Dateiendung automatisch an den Dateinamen gehängt, sodass die Datei "test.pdf" entsteht.

Das Problem:

Wenn ich im FileChooser als Dateiformat z.B. "pdf" wähle und als Dateinamen "test", wobei es bereits eine Datei mit dem Namen "test.pdf" gibt, erscheint kein Hinweis, dass die Datei bereits existiert, sondern wird ohne Nachfrage überschrieben. Der Grund ist klar: "f.exists" in approveSelection liefert "false", da f.getName() z.B "C:\bla\test" liefert und diese Datei natürlich nicht existiert.

Meine Frage nun, ob man meiner FileChooser Klasse beibringen kann, wenn der Dateiname für einen bestimmten Dateityp ohne Endung eingegeben wurde, hierauf ebenfalls zu reagieren, wenn der Dateiname+Dateiendung bereits existiert. 
Das Hauptproblem sehe ich hierbei, dass meine FileChooser Klasse nicht wissen kann, welcher Dateityp ausgewählt wurde. Aus diesem Grund ist folgendes nicht möglich:



```
@Override
	public void approveSelection() {
		File f = getSelectedFile();
		
		if (f.exists()) {
			showOverWriteDialog();
		}
		else  {
			File pdfFile = new File(f.toString() + ".pdf");
			File txtFile = new File(f.toString() + ".txt");
			if (pdfFile.exists() || csvFile.exists()) {
				showOverWriteDialog();
			}
			
		}
		super.approveSelection();
	}
```

Neben der schlechten Performance des else-Zweiges besteht das Problem, wenn ich z.B. "huhu" im FileChooser als Dateinamen eingebe und eine pdf Datei erzeugen möchte, es aber eine "huhu.txt" bereits gibt, der showOverWriteDialog() auch angezeigt wird.

Ich hatte gehofft, die komplette Erkennung, ob es eine Datei bereits schon gibt, in meiner abgeleitetetn FileChooser Klasse erledigen zu können. Die Notlösung wäre die Behandlung in der GUI, wenn ich feststellen kann, welcher Dateityp ausgewählt wurde:


```
if (fileChooser.getFileFilter().getDescription().equals(PDF-Datei (*.pdf))) {
				this.isPdfExport = true;
				if (file != null && !file.getName().endsWith(.pdf)) {
	                file = new File(file.toString() + .pdf);
	                if (file.exists()) {
	                	// Hier den Dialog zum Überschreiben der Datei einfügen !!!
	                }
	            }
			}
```

Eine Internetrecherche hat leider nichts ergeben. Dort sind alle scheinbar damit zufrieden, dass der FileChooser existierende Dateien erkennt, die durch Selektion mit der Maus im FileChooser ausgewählt wurden.

Danke für Hinweise (und das Lesen bis hier *g*)

Gruß...


----------



## diggaa1984 (11. Dez 2008)

sofern du die Filter einbaust, kommst da auch wieder ran, lass dir vom JFileChooser#getChoosableFileFilters die eingestellten FileFilter geben. Dann vermutlich auf FileNameExtensionFilter casten, sofern genutzt, und da kannst dann die Endungen abfragen, pauschal an dein test-String hängen und nachschauen ob die Datei existiert. Quasi für alle Filter und da wiederum für alle Extensions (es könnten ja auch mehrere Endungen in einem Filter sein)


----------

