Ist es sicher, Windows-Dateipfade durch einfaches Ersetzen in Unix-Dateipfade zu konvertieren?

12

Nehmen wir zum Beispiel an, ich hätte es so, dass alle meine Dateien von einem Windows-Computer auf einen Unix-Computer übertragen werden: C:\test\myFile.txtnach {somewhere}/test/myFile.txt(Laufwerksbuchstabe ist an dieser Stelle irrelevant).

Gegenwärtig bietet unsere selbst geschriebene Utility-Bibliothek eine Methode, mit der alle Back-Slashes durch Forward-Slashes ersetzt werden können:

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

Schrägstriche sind reserviert und können nicht Teil eines Dateinamens sein, daher sollte die Verzeichnisstruktur beibehalten werden. Ich bin mir jedoch nicht sicher, ob es andere Komplikationen zwischen Windows- und Unix-Pfaden gibt, über die ich mir Sorgen machen muss (z. B. Nicht-ASCII-Namen usw.).

MxLDevs
quelle
4
Achten Sie auf Leerzeichen - das Einfügen von Leerzeichen in Windows-Ordnernamen ist weitaus häufiger als in Unix-Verzeichnisnamen. Insbesondere "\ Programme" holt mich die ganze Zeit. Abhängig davon, wie Sie die Pfade verwenden, müssen Sie möglicherweise Leerzeichen mit "\" maskieren.
Rob
1
Lassen Sie uns der Einfachheit halber den Bereich der Pfade einschränken, um variable Pfade auszuschließen.
MxLDevs
2
@MxyL Das Problem wird nicht behoben, wenn Sie den Pfad fest codieren, anstatt eine Umgebungsvariable zu verwenden. Wenn Sie nur einen Weg wollen, der nicht in die Luft sprengt, sollten Sie in Ordnung sein. Wenn Sie einen aussagekräftigen Pfad suchen oder mit anderer Software (oder Benutzererwartungen ...) interagieren möchten, benötigen Sie Aufrufe zur Beurteilung pro Pfad.
1
@delnan Ich konzentriere mich hauptsächlich darauf, einen gültigen Pfad zu erstellen, aber das ist ein guter Punkt. Die Pfade, die ich konvertiere, sollten so einfach sein, dass sie für sich selbst von Bedeutung sind.
MxLDevs
3
Backslashes sind in Dateinamen unter Linux zulässig. Das Ersetzen von Backslashes in einem Linux-Pfad kann daher zu ungültigen Verzeichnissen führen. Zum Beispiel /foo\\barist nicht gleichbedeutend mit /foo/barunter Linux.

Antworten:

7

Ja, wenn Sie den Austausch nur unter Windows ausführen und ihn deaktivieren, wenn Sie auf anderen Systemen ausgeführt werden.

Das Ersetzen auf Unix-ähnlichen Systemen ist falsch, da \es sich auf Unix-ähnlichen Plattformen um ein gültiges Zeichen in einem Datei- oder Verzeichnisnamen handelt. Auf diesen Plattformen sind nur NULund /in Datei- und Verzeichnisnamen verboten.

Außerdem erlauben einige Windows-API-Funktionen (meistens die niedrigeren) die Verwendung von Schrägstrichen nicht - mit ihnen müssen Backslashes verwendet werden.

Demi
quelle
4

Ja, aber das Ganze ist ein strittiger Punkt. Java konvertiert unter Windows Schrägstriche nahtlos in umgekehrte Schrägstriche. Sie können einfach Schrägstriche für alle Pfade verwenden, die fest codiert oder in der Konfiguration gespeichert sind. Dies funktioniert für beide Plattformen.

Ich persönlich verwende den Schrägstrich auch unter Windows immer, da er nicht das Escape-Zeichen ist. Unabhängig davon, ob der Rohpfad im Code enthalten ist oder in einer Eigenschaftendatei ausgelagert wurde, codiere ich ihn auf die gleiche Weise.

Versuch es! Dies funktioniert in Windows. Ändern Sie den tatsächlichen Pfad in einen vorhandenen Pfad, und Ihr Benutzer hat die Berechtigung zum Lesen.

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

Bonus: Sie können sogar Schrägstriche auf dem gleichen Weg mischen !

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}

quelle
1
Wenn Sie meine gesamte Antwort lesen, werden Sie sehen, wo ich sage, dass die Verwendung des Unix-Dateitrennzeichens an beiden Stellen immer korrekt funktioniert, ohne dass eine Konvertierung erforderlich ist.
Die Frage stellt fest , dass die Dateien übertragen werden sollen, und die Blätter öffnen , wie die Dateinamen gespeichert werden. Ich habe der Frage einen Kommentar hinzugefügt, in dem ich um Klärung dieses Punktes gebeten habe. Basierend auf der Antwort bearbeite ich meine Antwort entsprechend.
Es ist ziemlich unwahrscheinlich, dass das Programm tatsächlich eine manuell eingegebene Liste aller übertragenen Dateien enthält. Es ist weitaus wahrscheinlicher, dass ein automatisierter Mechanismus zum Auflisten der Dateien verwendet wird. Angesichts der in der Frage angegebenen Parameter des Problems liefert dieser Mechanismus herkömmliche Pfade im Windows-Stil. In der jetzigen Form fordert diese Antwort das OP auf, ein anderes Problem zu lösen, ohne ihnen mitzuteilen, wie oder sogar, dass sie ihr Problem in ein anderes Problem umwandeln sollen.
Eliah Kagan
Bitte lies meinen vorherigen Kommentar.
1
Windows erkennt sowohl vorwärts als auch rückwärts gerichtete Schrägstriche und ist dies seit den Anfängen von MS-DOS. Dh jeder Microsoft OS-Kernel hat Forward Slash Separator-Unterstützung. Frühe COMMAND.COMInterpreter hatten eine Laufzeitpräferenz: Sie konnten konfigurieren, welche Schrägstriche der Interpreter zum Drucken und Parsen verwenden würde.
Kaz
3

Eine weitere Schwierigkeit bei Windows ist, dass es neben den herkömmlichen Laufwerksbuchstaben auch die UNC-Notation unterstützt.

Auf eine Datei auf einem entfernten Dateiserver kann zugegriffen werden als \\server\sharename\path\filename.

Simon B
quelle
1
Ich denke, dies ist das einzige bisher erwähnte Problem, das für diese Anwendung tatsächlich ein Problem darstellt. Wenn es sich um UNC-Pfade handelt, können diese nicht sinnvoll in einen Pfad im Unix-Stil konvertiert werden.
Jules
2

Nein. Es gibt weit mehr zu bedenken als nur das Pfadtrennzeichen (das "\ vs /"). Wie Rob Y erwähnt, gibt es die Art und Weise, wie mit Leerzeichen umgegangen wird, und ihre Häufigkeit bei der Verwendung von Windows. In beiden Umgebungen gibt es unterschiedliche unzulässige Zeichen. Es gibt die Bereitschaft von Unix, fast alles zuzulassen, wenn ein führendes "\" entgeht. Windows verwendet "", um eingebettete Leerzeichen zu verarbeiten. Windows verwendet UCS-16 und Unix ASCII oder UTF-8.

usw. , usw. , usw.

Aber für viele Anwendungen , die Einschränkungen für die Pfadnamen sie benötigen , setzen können zu manipulieren, können Sie es tatsächlich tun , so wie Sie vorschlagen. Und es wird zumindest in einer großen Anzahl von Fällen funktionieren, nur nicht in allen.

Ross Patterson
quelle
1
Ich glaube nicht, dass diese Bedenken für die gestellte Frage gelten. Unix-Systeme können Leerzeichen in Dateinamen genauso verarbeiten wie Windows. Die unzulässigen Windows-Zeichen sind eine Obermenge der Unix-Zeichen. Die Windows-Dateinamen dürfen keine umgekehrten Schrägstriche enthalten (mit Ausnahme der zu konvertierenden Verzeichnisseparatoren). Die Verwendung von Anführungszeichen für eingebettete Leerzeichen ist ein Problem auf Benutzerschnittstellenebene und kein Problem bei der Dateiverwaltung. Der Konvertierungscode ist anscheinend in Java, daher sollte die UCS16-> UTF8-Konvertierung automatisch erfolgen.
Jules
-1

Jedes Microsoft-Betriebssystem, das mit MS-DOS beginnt, hat auf Kernel-Ebene sowohl Schrägstriche als auch umgekehrte Schrägstriche verstanden .

Daher können Sie unter Windows zwischen ihnen frei konvertieren. beide haben den gleichen Status wie reservierte Trennzeichen. In jedem gültigen Pfad können Sie umgekehrte Schrägstriche durch Schrägstriche ersetzen und umgekehrt, ohne die Bedeutung für den Kernel zu ändern.

In früheren DOS-Versionen hat der command.comInterpreter von Microsoft festgelegt, welcher Schrägstrich zum Anzeigen und Parsen von Pfaden verwendet wird. Das wurde schließlich entfernt.

Einige User-Space-Programme in Windows wie die Windows-Shell ( explorer.exe) mögen keine Schrägstriche. Das ist nur mühselige Programmierung in diesen Programmen.

Kaz
quelle
1
Obwohl dies zutrifft, glaube ich nicht, dass es für die Frage des OP hilfreich ist, bei der (AIUI) vorhandene Pfadnamen konvertiert wurden, die bereits die umgekehrten Schrägstriche enthalten hätten. Es ist sehr nützlich, wenn Sie plattformübergreifenden Code schreiben, um zu erkennen, dass Sie nur Schrägstriche verwenden und diese in den meisten Kontexten verwenden können, aber in diesem Fall halte ich das nicht für hilfreich.
Jules
@Jules OP überträgt Dateien von Windows. Diese Antwort erklärt, dass keine Backslashes ersetzt werden müssen. Sie befinden sich überhaupt nicht im Windows-Dateisystem. Alle Pfade lassen sich mit Schrägstrichen ausdrücken (und Windows versteht das sogar).
Kaz