Entwickler-Ecke

Dateizugriff - zwei Verzeichnisse auf Gleichheit prüfen


stiftmaster - Mi 03.02.10 17:31
Titel: zwei Verzeichnisse auf Gleichheit prüfen
Hallo,

meine Funktion "SindVerzeichnisnamenGleich" kriegen zwei string übergeben. Als Ergebnis soll zurückgeliefert werden, ob es sich um das gleiche Verzeichnis handelt oder nicht. Hintergrund ist, dass Verzeichnisnamen ja unterschiedliche geschrieben werden können, es sich aber um das gleiche Verzeichnis handelt.

Beispiel:
C:\Programme
C:\Program
C:\Prog~1 (oder wie auch immer genau diese alte Kurzschreibweise funktionierte)
C:\programme

Gibt es dafür bereits fertige Funktionen, die dies handeln? Kann aktuell nichts finden und bin daher für jeden Tipp dankbar.

Gruß

Stefan


Delete - Mi 03.02.10 19:07

Ich nehme an Vista und höher?

Es gibt nur das physische Verzeichnis c:\program files. Such mal mit Google nach Suche bei Google VISTA C:\PROGRAM FILES C:\PROGRAMME da wird alles erklärt.


jaenicke - Do 04.02.10 00:28

Es gibt immer auch noch die DOS-Schreibweise, es sei denn man hat in der Registry die 3.8 Namen deaktiviert.
Um die jeweils umzuwandeln gibt es GetShortPathName [http://msdn.microsoft.com/en-us/library/aa364989(VS.85).aspx] bzw. GetLongPathName [http://msdn.microsoft.com/en-us/library/aa364980(VS.85).aspx].

Was die NTFS Junctions und andere Reparse Points angeht:
Diese Daten kann man relativ einfach via DeviceIOControl und FSCTL_GET_REPARSE_POINT [http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx] auslesen.
Bzw. um überhaupt zu erkennen ob es sich bei einem Verzeichnis um einen Reparse Point handelt kannst du mit GetFileAtributes [http://msdn.microsoft.com/en-us/library/aa364944(VS.85).aspx] feststellen ob das entsprechende Attribut FILE_ATTRIBUTE_REPARSE_POINT gesetzt ist.


DonManfred - Do 04.02.10 15:07

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
die DOS-Schreibweise, es sei denn man hat in der Registry die 3.8 Namen deaktiviert.


[oberlehrer an]8.3 - Namen. Bestehend aus 8 Zeichen vor dem Punkt, EINEM Punkt und 3 Zeichen als Extender[oberlehrer off]


stiftmaster - Fr 05.02.10 13:04

Hallo,

vielen Dank für eure Hilfe. Die "DOS-Schreibweise" habe ich mit GetLongPathName gelöst bekommen. Ebenso die Problematik mit Groß- und Kleinschreibung. Der Code sieht daher aktuell so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function ArePathTheSame(const Path1, Path2: string): Boolean;
var
  Temp1, Temp2: string;
begin
  Temp1 := GetLongFileName(Path1);
  Temp1 := ExcludeTrailingPathDelimiter(Temp1);

  Temp1 := AnsiUpperCaseFileName(Temp1);

  Temp2 := GetLongFileName(Path2);
  Temp2 := ExcludeTrailingPathDelimiter(Temp2);
  Temp2 := AnsiUpperCaseFileName(Temp2);

  Result := (Temp1 = Temp2);
end;


Als letztes Problem bleibt noch die "Vista-MultiLanguage-Problematik". Mir ist komplett bewusst, was damit gemeint ist, allerdings nützt mir das nicht viel :-) Ich bräuchte ja eine Funktion "MacheAusÜbersetzungsStringDasKorrekteVerzeichnis". Da habe ich aber bisher nichts gefunden. Ich kann auch nicht pauschal "Programme => Program Files" umwandeln:
- es gibt auch andere Verzeichnisse (Program Data sei hier nur erwähnt)
- ich kann nicht sicherstellen, dass alle "Deutsch" als Sprache eingerichtet haben
=> es muss universell funktionieren.

Bin für jeden Tipp dankbar

Gruß

Stefan

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt