Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   letzen Ordnernamen eines Pfades ermitteln (https://www.delphipraxis.net/55875-letzen-ordnernamen-eines-pfades-ermitteln.html)

padavan 28. Okt 2005 06:21


letzen Ordnernamen eines Pfades ermitteln
 
Moin,

wie komm ich eigentlich an den letzten Ordner eines Pfades dran?

z.B.
Pfad:
c:\test\Gruppierung1\dateinamen_n.txt
ich möchte haben:
"Gruppierung1"

Habe sowas schonmal gebraucht und auch hinbekommen, allerdings hatte der letzte Ordnername eine festdefinierte Länge, und somit war´s einfach. Aber was, wenn der letzte Ordnername keine feste Länge hat?

:roll:

Sharky 28. Okt 2005 06:31

Re: letzen Ordnernamen eines Pfades ermitteln
 
Hai padavan,

nur mal so ins blaue gedacht:
  • Die Ordnerstruktur ist durch ein abschliessenden \ vom Dateinamen getrennt.
  • Jeder Ordner ist durch ein \ vom anderen getrennt
  • Das "root-laufwerk" ist durch ein :\ von den Ordnern getrennt

Du musst also nur den letzen Backslash suchen und vor dort(nach links) bis zum nächsten Backslash suchen.
Wenn in dem String nur ein \ vorkommt steht in ihm eine Datei des root.

padavan 28. Okt 2005 06:40

Re: letzen Ordnernamen eines Pfades ermitteln
 
Stimmt!
werd mich nachher gleich mal dran machen.

Vielen Dank
Padavan

(Ergebnisse werd ich posten)

marabu 28. Okt 2005 07:13

Re: letzen Ordnernamen eines Pfades ermitteln
 
Hier ist schon mal meins:

Delphi-Quellcode:
function Folder(fileName: string): string;
begin
  Delete(fileName, 1, Length(ExtractFileDrive(fileName)));
  SetLength(fileName, Length(fileName) - Succ(Length(ExtractFileName(fileName))));
  Result := ExtractFileName(fileName);
end;
Grüße vom marabu

DevilsCamp 28. Okt 2005 07:22

Re: letzen Ordnernamen eines Pfades ermitteln
 
Marabus Lösung ist kürzer als meine, aber ich will sie trotzdem nicht vorenthalten:

Delphi-Quellcode:
function GetLastDirFromPath(const Pfad: String): String;
var
  i : Integer;
  j : Integer;
  s : String;
begin
  i := 1;
  j := 1;
  s := ExtractFilePath(Pfad);
  Delete(s, Length(s), 1); // Abschliessendes \ entfernen

  // Und jetzt nach einem \ suchen, bis man das letzte hat
  // Dazu wird die Position des vorhergehenden gesichert
  while (i>0) do
  begin
    j := i;
    i := PosEx('\', s, i+1); // function PosEx(SubStr, S: String; Offset: Integer = 1): Integer;
                             // Sucht SubStr in S ab Position Offset
                             // Ergebnis: Wenn (SubStr nicht gefunden wurde)or(Offset>Length(s))or(Offset<1) dann 0 sonst (Position von SubStr)
                             // Für PosEx muss die Unit StrUtils eingebunden werden
  end;

  Result := Copy(s, j+1, Length(s));
end;

padavan 28. Okt 2005 07:37

Re: letzen Ordnernamen eines Pfades ermitteln
 
Danke euch,
da zeig ich meinen konfusen, noch nicht funktionierenden Quellcode lieber nicht.

:stupid:


Gruß
Padavan
:hi:

Sharky 28. Okt 2005 07:42

Re: letzen Ordnernamen eines Pfades ermitteln
 
Zitat:

Zitat von padavan
... noch nicht funktionierenden Quellcode lieber nicht. ...

Hai padavan,

Du solltest aber trotzdem versuchen deinen Code zum laufen zu bekommen. Es hilft auf dauer ja nicht fertigen Code zu verwenden weil man in seinem eigenen Fehler hat ;-)

(Darum habe ich ja auch keinen fertigen Code gezeigt sondern nur einen Weg wie man es lösen kann)

padavan 28. Okt 2005 08:03

Re: letzen Ordnernamen eines Pfades ermitteln
 
das stimmt, nur nachdem ich angefangen hab und mittendrin eine Antwort erhielt, wäre ich jetzt beeinflusst.
Was um Himmels willen nicht heißen soll, dass ich keine Antworten mehr haben will.
:mrgreen:

das war meins (aber noch nicht fertig und verworfen, marabus´s gefällt mir einfach besser, egal ob ich meines zum Laufen bring)

Delphi-Quellcode:
function gibletztenOrdner(komplett: String): String;  // es muss der ganze Pfad mit Dateiname übergeben werden
var                                                   //
    Teilstring: String;
    p1: integer;
    p2: integer;
    c: integer;
    i: integer;
    Ergebnis: String;
begin
{
  'c:\test\Gruppe1\Datei.txt'
                  p2-letzter Backslash
          p1-vorletzter Backslash
          |---c---|
}

  for i := 0 to length(komplett) - 1 do begin
    p1 := pos('\',komplett);                               // liefert vorletzten Backslash

//hier fehlt noch was...

  end;



  p2 := pos('\' + extractfilename(komplett),komplett);   // liefert letzten Backslash
  c := p2 - P1;

  Ergebnis := copy(komplett,p1,c);
  result := Ergebnis;
end;

DevilsCamp 28. Okt 2005 08:21

Re: letzen Ordnernamen eines Pfades ermitteln
 
Siehe Kommentare im Code:

Delphi-Quellcode:
function gibletztenOrdner(komplett: String): String;  // es muss der ganze Pfad mit Dateiname übergeben werden
var                                                   //
    Teilstring: String;
    p1: integer;
    p2: integer;
    c: integer;
    i: integer;
    Ergebnis: String;
begin
{
  'c:\test\Gruppe1\Datei.txt'
                  p_2-letzter Backslash
          p_1-vorletzter Backslash
          |---c---|
}

  for i := 0 to length(komplett) - 1 do begin
    p1 := pos('\',komplett);                               // liefert vorletzten Backslash


// Da du immer den gesamten String überprüfst, wirst du immer den ERSTEN Backslah finden (DevilsCamp)
// Kleiner Tip: Gehe die Schleife von Length(komplett) bis 1 runter und Prüfe, ob komplett[i]='\'. Sicher dann die Position des zweiten '\'



//hier fehlt noch was...

  end;



  p2 := pos('\' + extractfilename(komplett),komplett);   // liefert letzten Backslash

// Das liefert tatsächlich die Position des letzten Backslashs (DevilsCamp)

  c := p2 - P1;

  Ergebnis := copy(komplett,p1,c);
// Hier würde das vorletzte \ mit im Ergebnis stehen. Wenn dies aber mit im Ergebnis sein soll, dann ist es richtig (DevilsCamp)
  result := Ergebnis;
end;
So wie der Code geschrieben wurde, bekommst du immer den String, der zwischen dem ersten und dem letzten Backslash steht (inkl. dem ersten Backslash)

padavan 28. Okt 2005 08:38

Re: letzen Ordnernamen eines Pfades ermitteln
 
Danke für den Tipp,
ich versuch´s dann nochmal.
Bin ja froh, dass du noch halbwegs den Ansatz im meinem Codefetzen erkannt hast...
:-D

Padavan

s14 28. Okt 2005 08:52

Re: letzen Ordnernamen eines Pfades ermitteln
 
Hallo,
wie wär's damit.. :mrgreen:

Delphi-Quellcode:
function gibletztenOrdner(komplett: String): String;  // es muss der ganze Pfad mit Dateiname übergeben werden
begin
  Result := ExtractFileName(ExcludeTrailingPathDelimiter(ExtractFilePath(komplett)));
end;
..da ist man auch nicht auf den Backslash festgelegt.

dahead 28. Okt 2005 09:10

Re: letzen Ordnernamen eines Pfades ermitteln
 
Morgen,

Kann man da nicht auch einfach die Funktion ExtractRelativePath verwenden?

Delphi-Quellcode:
fShortDirectory := ExtractRelativePath(fFullDirectory, fFullDirectory);

eddy 28. Okt 2005 10:18

Re: letzen Ordnernamen eines Pfades ermitteln
 
Hallo Leute,

was haltet Ihr davon (getestet unter Delphi 5):



Delphi-Quellcode:
function GetLstPathName( pn : string) : string;
begin
  pn := ExcludeTrailingBackslash(ExtractFilePath(pn));
  // es sollte eigentlich immer noch ein \ in der Zeichenkette stehen
  Result := copy(pn, LastDelimiter('\', pn)+1, length(pn));
end;

// pn muß am Ende ein Backslash haben oder einen Dateinamen

procedure TFAB.test1Click(Sender: TObject);
begin
  // Aufruf entweder nur mit Pfadname auf \ endend
  s := 'C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Testpfad\Settings\';

  // oder mit Dateiname

  s := 'C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Testpfad\Settings\test.dat';

  lblTest.Caption := GetLstPathName(s); // --> Settings
end;

@s14:
Delphi-Quellcode:
ExcludeTrailingPathDelimiter
gibt es unter Delphi5 noch nicht

@dahead:
Delphi-Quellcode:
fShortDirectory := ExtractRelativePath(fFullDirectory, fFullDirectory);
lieferte mir nur den Dateinamen im Test

mfg
eddy

dahead 28. Okt 2005 10:54

Re: letzen Ordnernamen eines Pfades ermitteln
 
@eddy:

du darfst diese funktion dann auch nur mit verzeichnis-namen aufrufen.

dimo 28. Okt 2005 12:18

Re: letzen Ordnernamen eines Pfades ermitteln
 
ExtractFileName(ExcludeTrailingBackSlash(ExtractFi lePath('c:\windows\system32\a.txt')))

s14 28. Okt 2005 12:41

Re: letzen Ordnernamen eines Pfades ermitteln
 
@dimo

Hast Du Beitrag #11 gelesen? :cyclops:

SMO 28. Okt 2005 12:57

Re: letzen Ordnernamen eines Pfades ermitteln
 
Kleine Anmerkung zu den ganzen Lösungen hier:

1.) Laut Delphi-Hilfe sollen neue Programme die Funktionen IncludeTrailingPathDelimiter und ExcludeTrailingPathDelimiter benutzen, nicht die alten Versionen mit "Backslash" im Namen. Natürlich nur, wenn wan eine entsprechend neue Delphi-Version hat, in der es diese Funktionen schon gibt.

2.) Kennt ihr den Unterschied zwischen ExtractFileDir und ExtractFilePath? Ersteres liefert das Verzeichnis ohne terminierenden Pathdelimiter. D.h. statt "ExcludeTrailingPathDelimiter(ExtractFilePath(...) )" kann man auch einfach "ExtractFileDir(...)" schreiben. ;)
Einen kleinen Unterschied gibt es aber schon:
ExcludeTrailingPathDelimiter(ExtractFilePath('C:\' )) ergibt 'C:'
ExtractFileDir('C:\') ergibt 'C:\'

Lannes 28. Okt 2005 13:05

Re: letzen Ordnernamen eines Pfades ermitteln
 
Hallo,

ab Delphi 3 und unter
Berücksichtigung von Dateien die sich im Root-Verzeichnis befinden können:
Delphi-Quellcode:
function FolderOrDrive(fileName: string): string;
var i : Integer;
begin
  Result := ExtractFileDir(fileName);
  i := LastDelimiter('\',Result);
  if i = 3 then
    Delete(Result,i,1)
    else
      Delete(Result,1,i);
end;

dimo 28. Okt 2005 13:19

Re: letzen Ordnernamen eines Pfades ermitteln
 
Nein :)
Zitat:

Zitat von s14
@dimo

Hast Du Beitrag #11 gelesen? :cyclops:



Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz