Dateisuche

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Dateisuche

Beitrag von saul »

Hallo,
mit file() kann ich überprüfen ob eine Datei vorhanden ist. Wie kann man das Unterverzeichnis einer bestimmten Datei ermitteln, wenn man nur den Dateinamen, nicht aber das Unter- oder Unter\Unterverzeichnis weiß?
mfg
Wolfgang
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateisuche

Beitrag von Martin Altmann »

Hallo Wofgang,
Du musst doch wissen, in welchem Verzeichnis Du mittels file() prüfen willst - oder verstehe ich Dich jetzt falsch?
Wenn Du nur file( "name.txt" ) prüfst und erhältst ein .t., dann liegt die natürlich im aktuellen Verzeichnis, das Du mittels CurDir() bekommen solltest.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Dateisuche

Beitrag von saul »

Hallo,
das habe ich mich nicht richtig ausgedrückt. Beispiel: Ich suche die Datei Target.ntx auf dem Laufwerk c:. Ich weiß aber nicht in welchem Unterverzeichnis diese Datei sich befindet.
mfg
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Dateisuche

Beitrag von AUGE_OHR »

hi,
saul hat geschrieben:das habe ich mich nicht richtig ausgedrückt. Beispiel: Ich suche die Datei Target.ntx auf dem Laufwerk c:. Ich weiß aber nicht in welchem Unterverzeichnis diese Datei sich befindet.
was machst du in Windows wenn du die Datei suchst ?

Ich kenne keine Xbase++ oder API Function die das "direkt" macht (naja unter Win7 soll es noch
einen erweiterten "Index" geben...).
Du müsstet wohl schon durch jedes Verzeichnis gehen wo du es vermutest oder vom Root ausgehen.

Hiermit "sammel" ich meine MP3 Files ein.

Code: Alles auswählen

PROCEDURE OPENMP3DIR(oPlayer,oText)
LOCAL oFileDlg
LOCAL cPathName
LOCAL nPosi     := 0
LOCAL nLstRead

   oFileDlg        := XbpFileDialog():new()
   oFileDlg:center := .T.
   oFileDlg:title  := 'Start Ordner auswählen'
   oFileDlg:create()
   cPathName := oFileDlg:saveAs("Select Path, Press Enter or Click SAVE",,.T.)

   IF .NOT. EMPTY(cPathname)
      *** extract path in case user selected a file
      nPosi := RAT("\",cPathName)
      IF nPosi > 0
         cPathName := UPPER(LEFT(cPathName,nPosi))
      ENDIF
      SELECT 1
...
      RECUDIRS(cPathName,"*.*",{| x,y | DO3WORK(x,y)})                                     // ALL FILES

      SELECT 1
   ENDIF
RETURN

STATIC PROCEDURE RECUDIRS(p_path,p_wildcard,bblock)

   IF lokRUN
      aDIZ := DIRECTORY(p_path+"*.*","D") // ALL Files
*    aDIZ := Directory(p_path+"*.MP3","D")
      nLEN := LEN(aDIZ)
//
// das ganze sortieren muss nicht sein
//
      // make all FileNames LOWER()
      AEVAL(aDIZ,{| x | x.filename := LOWER(x.filename)})
      ASORT(aDIZ,,,{| x,y | x.filename < y.filename})

      // First, put all sub-directories
      // at the beginning of the list
      ASORT(aDIZ,,,{| x,y | "D" $ x.fileattrib})

      // Now, lets find out where the other
      // files are
      AEVAL(aDIZ,{| x,i | nStartAt := ;
                   IF("D" $ x.fileattrib,i,nStartAt)})

      // Sort sub-directories only
      ASORT(aDIZ,1,nStartAt,{| x,y | x.filename < y.filename})
      nStartAt ++

      // Sort only the non-directory files.
      // Sort Array based on the first subarray
      // element
      nLEN := LEN(aDIZ)
//
// es geht nur darum
//
      FOR nCount := 1 TO nLEN
         IF "D" $ aDIZ[nCount,F_ATTR] .AND. .NOT. ;
                    (aDIZ[nCount,F_NAME] = "." .OR. ;
                    aDIZ[nCount,F_NAME] = "..")

            RECUDIRS(p_path+aDIZ[nCount,F_NAME]+"\",p_wildcard,bblock)
         ELSE
            EVAL(bblock,p_path,aDIZ[nCount,F_NAME])
         ENDIF
      NEXT
   ENDIF
RETURN

FUNCTION DO3WORK(ccPath,ccFile)
an DO3WORK(ccPath,ccFile) wird jedes File übergeben und kann ausgewertet werden.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Dateisuche

Beitrag von brandelh »

Hi,

das sieht doch genau nach der Frage aus, die ich im Alaskaforum eben beantwortet habe ;-)

Der einfachste und wohl auch schnellste Weg ist mit runShell() den Befehl
dir c:\test.prg /S /B > Files.txt
auszuführen. Hierbei entsteht eine Dateiliste mit Pfadangabe+Dateiname, sonst nichts (wegen /B).
Diese Liste kann man mit memoread() einlesen und durchsuchen. Das CRLF nach dem Dateinamen ist das Ende,
das davor der Anfang des Namens. Wenn genau eine Datei in der Liste ist dürfte es keine CRLF geben,
dann hat man den Namen direkt.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Dateisuche

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Der einfachste und wohl auch schnellste Weg
ja meistens
brandelh hat geschrieben:ist mit runShell() den Befehl dir c:\test.prg /S /B > Files.txt
das ist viel schneller !!!
... und wenn mir jemand noch verrät wie man das ohne Runshell, mit öffnen der Box, hin bekommt...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Dateisuche

Beitrag von brandelh »

Hallo Jimmy,

du kannst die Box minimiert (glaube ich) im Hintergrund (das weiß ich ;-) ) ablaufen lassen ...
Von Phil gibt es auch noch ein RunShell, das die Ausgabe direkt in eine Xbase++ Variable (oder so ähnlich) umleiten kann.
Ansonsten gibt es nur den von dir gezeigten Weg alles in Arrays zu laden (so ähnlich habe ich es bei den Löschfunktionen auch gemacht ...)
Möglicherweise bietet die API ja noch flottere Methoden, da war doch auch was bei Phil mit SH... Funktionen.
Gruß
Hubert
Antworten