Wie zu vermeiden, FileNotFound-Ausnahme beim ausführen von Java auf Linux, weil der Fall sein Feingefühl?

StackOverflow https://stackoverflow.com/questions/1733770

Frage

Meine Webanwendung läuft auf Windows.Ich möchte meine app auf Linux auch.Ich überwunden zu haben scheinen die meisten Probleme, wie path separator, etc.

Wirkliche problem ist jetzt ich bekomme FileNotFoundException wenn der Java-code versucht, eine Datei zu öffnen sagen Abc.txt wenn nur abc.txt vorhanden ist.:(

Ich kann nicht ändern, dass alle Dateinamen in Kleinbuchstaben oder Großbuchstaben, wie ich eine ganze Menge von Dateien.Ohne ändern von code wesentlich ist, dass jede Möglichkeit, dies zu vermeiden?

War es hilfreich?

Lösung

Es gibt keine Möglichkeit, dies zu vermeiden, da der java.io.File API ist systemabhängig. Sie haben das Recht Fall verwenden, wenn Dateien auf Linux / Unix zu manipulieren. Eigentlich ist mein Rat / Lösung wäre, strenge und tragbare Konventionen bei der Entwicklung unter Windows folgen (zum Beispiel Kleinschreibung Dateinamen verwenden nur oder besser verwenden, um die genauen Dateinamen, wenn es programmatisch Zugriff ). Um ehrlich zu sein, verstehe ich nicht, warum Sie versuchen, Abc.txt zu laden, wenn der Dateiname abc.txt ist. Dies ist eine schlechte Gewohnheit (gelehrt durch zu viel Zeit auf Windows-Ausgaben) eher als ein Linux / Unix Problem.

Andere Tipps

Fix it!

Jedes Schema, das Sie circumvent ersinnen Festsetzung es noch schlimmer auf lange Sicht sein wird.

Nun, zuallererst denke ich, dass Sie sollte betrachten Sie bewegen, um ein konsistentes Schema, anstatt Sie zu verwenden einige Problemumgehung.

Wie auch immer, was über Lesen in alle Datei-Namen und setzen Sie in eine Karte enthält die lower-case name als Schlüssel?Sie können dann suchen Sie die richtigen Dateinamen aus der Karte.

Dies würde auch ermöglichen, Sie zu erkennen, einen Konflikt, z.B.zwei Dateien "FileA.txt" und "FILEA.TXT" im gleichen Verzeichnis, die das gleichen Kleinbuchstaben Darstellungen, in dem Fall, dass Sie wissen, dass Sie haben, um dieses problem zu lösen in eine völlig andere Art und Weise (weil Sie wissen, welches Sie wollen, geöffnet haben, und es ist mehrdeutig, und so eine Problemumgehung, die es nicht tun, dann).

Unter der Annahme, dass die Dateien gemischter Fall auf Linux sind, gibt es keine einfache Antwort.

Das Beste, was ich denken kann, ist Ihre Anwendungsliste der entsprechenden Verzeichnisse haben, und erstellen Sie eine in Speicherdatenstruktur der aktuellen Linux-Dateinamen. Dann eine Groß- und Kleinschreibung Datei öffnen zu tun, teilen Sie die Pfadnamen in Komponenten finden Sie in den In-Memory-Baum Groß- und Kleinschreibung Suche verwenden, bulid den reale (case-sensitive) Pfadnamen und verwendet, die die Datei öffnen zu tun.

Das Problem dabei ist, dass es (und Ihre Anwendung in der Tat) kann nicht mit dem Fall fertig werden, wo man (sagen wir) „foo.txt“ AND „foo.txt“ im gleichen Verzeichnis Linux haben.

Aber die beste Lösung ist, Ihre Anwendung zu ändern, so dass es mit Groß- und Pfadnamen funktioniert.

Warum kann man nicht eine Menge von Dateien ändern? Wenn die Menge der Dateien ist wirklich das einzige, was Sie zurückhält, dann einfach ein kleines Skript schreiben, dass sie alle in Kleinbuchstaben umbenennt.

Es ist nicht von Ihrer Frage klar, was der Fall Änderung Ihrer Dateien verursacht. Wenn alle Ihre Dateien in Linux klein geschrieben werden, während sie auf Fenster gemischten Fall sind, können Sie nur den Dateinamen umwandeln Fall zu senken, etwa so:

new File(filename.toLowerCase())

Es gibt eine Lösung, die schreckliche Laufzeitleistung hat, aber sehr einfach zu implementieren:

Ersetzen new FileReader(name) mit so etwas wie

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

Ich habe nicht diesen Code kompiliert, kann es Fehler und Fehler haben. Ich lasse sie Ihnen zu beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top