Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pfad ermitteln einer Datei (https://www.delphipraxis.net/14645-pfad-ermitteln-einer-datei.html)

Alex_ITA01 13. Jan 2004 11:09


Pfad ermitteln einer Datei
 
Hallo erstmal,
ich habe da mal ein problem und zwar wenn ich angenommen in einer listbox ein dateinamen geladen habe (z.B. Hallo.txt), wie bekomme ich jetzt den Pfad heraus wo sich die datei befindet?
wenn ich C:\Hallo.txt habe , weiß ich mit ExtractFilePath();
ich habe aber nur Hallo.txt kann ich da nicht irgendwie herausfinden wo die liegt?

mfg Alex

Matze 13. Jan 2004 11:10

Re: Pfad ermitteln einer Datei
 
Mit FindFirst/FindNext suchen lassen.

Man erhält so ganz einfach den Pfad.

Alex_ITA01 13. Jan 2004 11:11

Re: Pfad ermitteln einer Datei
 
danke werde es mal probieren
mfg alex

Matze 13. Jan 2004 11:11

Re: Pfad ermitteln einer Datei
 
Achja, hier der Link dazu:

http://www.delphipraxis.net/viewtopi...ight=findfirst

Alex_ITA01 13. Jan 2004 11:16

Re: Pfad ermitteln einer Datei
 
jo danke schön,wollte nämlich grade fragen wie das geht aber hat sich ja jetzt mit dem link erledigt

mfg alex

Alex_ITA01 13. Jan 2004 11:24

Re: Pfad ermitteln einer Datei
 
@Matze: ich muss doch nochmal nachfragen :-)

und zwar habe ich das jetzt mal so gemacht:
//Aufruf
FindAllFiles('C:','*.*',true);
//Aufruf

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
      try
        repeat
          if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
            if (SR.Name <> '.') and (SR.Name <> '..') then
              FindAllFiles(RootFolder + SR.Name, Mask, Recurse);
        until FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory <> faDirectory then
        begin
          // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //       RootFolder + SR.Name

          // folgende Zeile schreibt den vollständigen Namen in eine Memo Feld des
          // Formulars Form1
          //Form1.Memo1.Lines.Add(RootFolder + SR.Name);
        end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
end;
mein problem ist jetzt wo gebe ich denn an das er Hallo.txt suchen soll?
und kann ich auch mehrere Partitionen durchsuchen lassen?

MFG Alex

MathiasSimmack 13. Jan 2004 11:26

Re: Pfad ermitteln einer Datei
 
Bei "Mask" im Kopf der Prozedur:
Zitat:

Zitat von Alex_ITA01
Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);

"*.*" steht nämlich für alle Dateien.

Mehrere Partitionen kannst du nur durchsuchen, wenn du vorher ermittelst, wie viele es auf dem Ziel-Rechner gibt, und wenn du o.g. Prozedur dann am besten in einer Schleife aufrufst, wobei "RootFolder" dann die jeweilige Partition (C:\ -> ?) ist.

Alex_ITA01 13. Jan 2004 11:28

Re: Pfad ermitteln einer Datei
 
achso, danke
und geht das auch mit mehrern partitionen?

mfg alex

Luckie 13. Jan 2004 11:45

Re: Pfad ermitteln einer Datei
 
Ich wüede es prinzipiell anders machen. Irgendwo muss die Datei ja herkommen. Wenn du jetzt nur den Name ohne Pfad in der Listbox anzeigen läßt, würde ich den Pfad als Objekt zu dem Item in der Listbox speichern. Wie das geht, kannst du hier kucken: http://www.luckie-online.de/files/demos/ -> Listbox_AddObject

himitsu 13. Jan 2004 11:45

Re: Pfad ermitteln einer Datei
 
z.B. so:
Delphi-Quellcode:
For i := 67 {C} to 90 {Z} do
  FindAllFiles(Chr(i) + ':', '*.*', true);

Matze 13. Jan 2004 11:46

Re: Pfad ermitteln einer Datei
 
Wie's direkt geht, weiß ich nicht. :angle2:

Aber du könntest diese Procedure in einer Schleife durchlaufen.

Die Partitionen findest du so heraus:
http://www.delphipraxis.net/internal...ht=laufwerk%2A


Die Patitionen allein bekommst du, indem du nur die
Delphi-Quellcode:
DRIVE_FIXED
beachtest.

himitsu 13. Jan 2004 12:09

Re: Pfad ermitteln einer Datei
 
Und noch mal, mit Matzes Vorschlag drin:
Delphi-Quellcode:
Var i: Integer;
  S: String;

S := 'Hallo.txt';

For i := 67 {C} to 90 {Z} do
  If GetDriveType(PChar(Chr(i) + ':\')) = DRIVE_FIXED Then
    FindAllFiles(Chr(i) + ':', S, True);

Alex_ITA01 13. Jan 2004 13:29

Re: Pfad ermitteln einer Datei
 
danke für die ganzen vorschläge erstmal
das mit den partitionen habe ich schon hinbekommen, danke
@luckie das mit den objekten habe ich mir auch schon so überlegt das es da was geben muss werde das mal probieren danke

habe jetzt mal das beispiel für euch und er hängt sich in der FindAllFiles procedure fest:

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
      try
        repeat
          if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
            if (SR.Name <> '.') and (SR.Name <> '..') then
              FindAllFiles(RootFolder + SR.Name, Mask, Recurse);
        until FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory <> faDirectory then
        begin
          // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //       RootFolder + SR.Name

          // folgende Zeile schreibt den vollständigen Namen in eine Memo Feld des
          // Formulars Form1
          //Form1.Memo1.Lines.Add(RootFolder + SR.Name);
        end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
end;
//Aufruf
DateiInfo.Name := '04 - Within Temptation - Caged.mp3';
FindAllFiles('C:',DateiInfo.Name,true);
//Aufruf

tja er kommt aus der procedure nie wieder raus das das komische und ich habe nur C: hier auf arbeit

hoffentlich kann mir es jemand sagen

mfg alex

Alex_ITA01 13. Jan 2004 13:50

Re: Pfad ermitteln einer Datei
 
Okay sorry war mein Fehler denn er kommt wieder raus nur es dauert ewig, kann man das nicht beschleunigen?
mal trotzdem ne frage: wenn ich jetzt in einem String den Pfad zuweisen will wo die Datei liegt, wie mache ich das denn ich kann ja nicht sagen p := FindAllFiles('C:',DateiInfo.Name,true);
und auf RootFolder + SR.Name kann ich außerhalb der procedure nicht zugreifen.ist bestimmt nur ein denkfehler von mir wäre aber gut wenn ihr es mir sagt
mfg alex

himitsu 13. Jan 2004 13:59

Re: Pfad ermitteln einer Datei
 
Er such unter umständer schon eine ganze Weile (na gut, bei mir geht es mit N)
Bei mir ist es durchgelaufen.

Du kannst ja mal nach einer Weile an der markierten Stelle einen Haltepunkt legen (z.B. mit F5) und schauen wo dein Programm im Moment ist (z.B. die Maus über RootFolder halten und ins Hint schauen) - danach Haltepunkt weg (F5) und witerlaufen lassen (F9)

Code:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
[color=red] if AnsiLastChar(RootFolder)^ <> '\' then [/color]
    RootFolder := RootFolder + '\';

  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
oder einfach die aktuelle Position anzeigenlassen, dadurch dauert es aber noch mal etwas länger
(das aktielle Verzeichnis wird in der Fensterüberschrift von Form1 angezeigt)
Code:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  [color=red]Form1.Caption := RootFolder;
  Application.ProcessMessages;[/color]
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
[add]
Menno, bin heute wohl ständig zu langsam :wall:

Alex_ITA01 14. Jan 2004 08:00

Re: Pfad ermitteln einer Datei
 
hallo erstmal
ich muss nochmal stören :-)
hab mich gestern abend nochmal hingesetzt und mal ein wenig im debugger durchgegangen um den quelltext zu verstehen und alles drum herum und nun ist mir ja aufgefallen, ich suche ja eine datei, muss ich da nicht FindAllFiles('C:', DateiInfo.Name, FALSE); (wichtig das false), nehmen?

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
      try
        repeat
          if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
            if (SR.Name <> '.') and (SR.Name <> '..') then
              FindAllFiles(RootFolder + SR.Name, Mask, Recurse);
        until FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory <> faDirectory then
        begin
          // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //       RootFolder + SR.Name

          // folgende Zeile schreibt den vollständigen Namen in eine Memo Feld des
          // Formulars Form1
          //Form1.Memo1.Lines.Add(RootFolder + SR.Name);
          [b]Code := RootFolder + SR.Name; [/b]<----habe das so gemacht
        end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
end;
so rein vom theoretischen müsste doch in Code jetzt der Pfad liegen von der Datei (DateiInfo.Name) die ich suche oder? Also in DateiInfo.Name steht der Dateiname vollständig mit endung drinne.nur ich bekomme kein Pfad zurück,wo liegt das Problem?

MFG Alex

Matze 14. Jan 2004 08:03

Re: Pfad ermitteln einer Datei
 
Also an dem TRUE liegt's nicht.

Kann es sein, das du die function falsch aufrufst?


[/Edit]Ach ja, da, wo du
Delphi-Quellcode:
[b]Code := RootFolder + SR.Name; [/b]<----habe das so gemacht
stehen hast, kannst du den Pfad + Dateinamen herbekommen, das stimmt auf jeden Fall.

Anstatt deinem Code, kannst du testweise auch mal
Delphi-Quellcode:
Edit1.Text := RootFolder + SR.Name
schreiben, dann siehst du, ob das wenigstens stimmt.

Alex_ITA01 14. Jan 2004 08:17

Re: Pfad ermitteln einer Datei
 
die function wird schon richtig aufgerufen, er springt ja rein und macht da drinne sein zeug.
ich habe jetzt mal probiert Code := RootFolder;
Code wird vorher auf '' gesetzt also da steht nix drinne,
ich brauch ja nur den Pfad nicht nochmal den Dateiname, (also ohne Sr.Name)
ich raffs einfach nicht... :-)

Alex_ITA01 14. Jan 2004 08:32

Re: Pfad ermitteln einer Datei
 
kaum zu glauben es geht.war ein denkfehler von mir sorry
nur leider braucht das programm sehr sehr lange um zwei mp3's zu vertauschen.das echt heftig.es muss doch ne möglichkeit geben das es schneller geht oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

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