Autor Beitrag
stiftmaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: Mi 03.02.10 17:31 
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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 bzw. GetLongPathName.

Was die NTFS Junctions und andere Reparse Points angeht:
Diese Daten kann man relativ einfach via DeviceIOControl und FSCTL_GET_REPARSE_POINT auslesen.
Bzw. um überhaupt zu erkennen ob es sich bei einem Verzeichnis um einen Reparse Point handelt kannst du mit GetFileAtributes feststellen ob das entsprechende Attribut FILE_ATTRIBUTE_REPARSE_POINT gesetzt ist.
DonManfred
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 148
Erhaltene Danke: 2

Windows 7
Delphi XE3 Pro + HTML5Builder
BeitragVerfasst: 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]

_________________
Gruss Manfred
stiftmaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: 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:

ausblenden 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