Ich fand einen Blogeintrag mit der gründlichsten, sogar ausgefeiltesten Funktion, die ich je gesehen habe, um dieses Problem zu lösen. Es behandelt alles, sogar schreckliche Ecke Fällen wie V:foo.txt
, wo Sie den subst
Befehl verwendet, um V:
zu Z:
zu mappen, aber Sie bereits subst
verwendet, um Z:
auf ein anderes Laufwerk zu mappen; Es läuft solange, bis alle subst
Befehle abgewickelt sind. URL:
http://pdh11.blogspot.com/2009/05/pathcanonicalize-versus-what-it-says-on.html
Mein Projekt ist reiner C-Code, und diese Funktion ist C++. Ich habe angefangen, es zu übersetzen, aber dann fand ich heraus, dass ich den normalisierten Pfad, den ich wollte, mit einem Funktionsaufruf erhalten konnte: GetLongPathName(). Dies wird nicht mit den schrecklichen Fällen umgehen, aber es hat meine unmittelbaren Bedürfnisse behandelt. Ich
entdeckt, dass GetLongPathName("foo.txt")
gibt nur foo.txt
, sondern nur durch ./
an den Dateinamen vorangestellt habe ich die Erweiterung auf normierter Form:
GetLongPathName("./foo.txt")
, wenn C:\Users\steveha
im Verzeichnis ausgeführt, kehrt C:\Users\steveha\foo.txt
.
Also, in Pseudo-Code:
, wenn das zweite Zeichen des Pfadnamen ist ':' oder das erste Zeichen ist '/' oder '\', rufen Sie einfach GetLongPathName() sonst, kopieren "./" in einen temporären Puffer, dann kopiere den Dateinamen in temp buffer + 2, um eine Kopie des Dateinamens mit vorangestelltem "./" zu erhalten und dann GetLongPathName() aufzurufen.
Solange die beiden Pfade in Dateien auf demselben Computer aufgelöst werden, sieht es so aus, als ob GetFileInformationByHandle() die richtige Antwort ist.Wenn sie zu verschiedenen Computern auflösen, sehe ich keine Garantie, und ich sehe auch keinen trivialen Weg, einen zu bekommen. Es ist nicht unbedingt einfach, dies zu testen. – RBerteig
Alle Dateien sind in meinem Fall lokal, das funktioniert also. –
@RBertig: Ich sehe auch keinen trivialen Weg, um einen zu bekommen. Aber ich fand ein sehr nicht-triviales und legte es in eine Antwort; Schau mal. Selbst dieser ist meist nur narrensicher, aber für die meisten Menschen sollte er mehr als genug sein. – steveha