Festplatte durchsuchen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

LoD123

Betreff: Festplatte durchsuchen

BeitragSo, Jul 22, 2007 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte mir eine Funktion schreiben mit der ich die Festplatte nach bestimmten Dateiendungen dursuchen kann.

Ich habe mir das so vorgestellt:
Zuerst erstelle ich eine temporäre Datei mit dem Ordnerinhalt meiner Festplatte. Danach lese ich den ersten Eintrag aus, lösche ihn aus der Datei und überprüfe ihn. Wenn der Eintrag eine Datei ist, wird er falls er die richtige Dateienung hat gespeichert. Wenn nicht gehts einfach weiter.
Wenn der Eintrag ein Ordner ist, wird in den gewechselt, wiederum eine temporäre Liste erstellt und genauso weitergemacht.
Wenn die Liste leer ist, lösche ich sie und gehe wieder eine Ebene nach unten.
Als Name für die temporären Dateien nehme ich den Ordnernamen.

Das Problem daran ist, wenn in einem Ordner ein anderer Ordner mit gleichem Namen enthalten ist, wird die temporäre Datei überschrieben und das Programm haut nicht mehr hin.

Ich habe mir schon überlegt anstatt der Ordnernamen, die Werte von Readdir() zu nehmen, aber anscheinend ändern sich die.

Hier das ganze als Code:
Code: [AUSKLAPPEN]

Function search(where$,dir$)
  newdir$ = ""
  sglfile$ = dir$+"list.sgl"
  If where$ = "all" Then
   
    For root=67 To 90 ;Datenträger ab Buchstaben C: - Z:
   
     
      If FileType(sglfile$) = 1 Then
        file = OpenFile(sglfile$)
        SeekFile file,FileSize(sglfile$)-1 ;Daten werden immer ans Ende geschrieben
      Else
        file = WriteFile(sglfile$)
      EndIf

      ChangeDir(Chr$(root)+":")
      If CurrentDir$() = Chr$(root)+":\" Then ;Diese Zeile überprüft ob es den jeweiligen Datenträger überhaupt gibt         
          Repeat
         
          name$ = relabs$(CurrentDir$())
          makelist(name$) ;Erstellt die temporären Listen
            checkfile$ = readlist$(name$) ;List den obersten Eintrag aus und löscht ihn
            SetStatusText(w_main,CurrentDir$()+checkfile$)
            If FileType(checkfile$) = 1 Then
              If Right$(checkfile$,3) = "txt" Then
                WriteLine file,CurrentDir$()+checkfile$ ;Schreibt absoluten Dateipfad in meine Liste
              EndIf
            ElseIf FileType(checkfile$) = 2 Then
              ChangeDir(checkfile$)
            Else
              dirold$=CurrentDir$()
              ChangeDir("..")
              dirnew$=CurrentDir$()
              deletelist(name$,-1)
              If dirold$=dirnew$ Then ;Überprüft ob Datenträger fertig dursucht wurde und startet mit dem nächsten
                Exit
              EndIf
            EndIf
          Forever
      EndIf

     
      CloseFile file
    Next
  EndIf     
 
End Function

; Diese Funktion erstellt den Namen für die temporäre Datei
;Ich habe vor den Namen der Datei noch die Größe der Dateien im Ordner drangehängt. Bringt aber nichts
;bei folgender Struktur:
; C:\ -> test\ -> test\ -> andererOrdner\ -> blabla...
;Also wenn nur der betreffende Ordner im anderen Ordner ist
Function relabs$(rel$)
  dir=readdir(rel$)
  size=0
  Repeat
    file$=nextfile$(dir)
    If file$<>"" Then
      size=size+filesize(file$)
    Else
      Exit
    EndIf
  forever
 
  curdir$ = Left(rel$,Len(rel$)-1)
  If Right$(curdir$,1) = ":" Then
    Return "root"+Left$(curdir$,1)
  EndIf
  pos=Instr(curdir$,"\")
 
  Repeat
    curdir$=Right(curdir$,Len(curdir$)-pos)
    pos=Instr(curdir$,"\")
    If pos=0 Then Exit
  Forever
  Return Str$(size)+curdir$
End Function



makelist, readlist und deletelist sind nur noch zum Erstellen, Auslesen und Löschen der temporären Dateien da.
Das Hauptproblem liegt also in der Benennung in der relabs-Funktion (was sich mal aus relative -> absolute zusammengesetzt hat).

Eigentlich nur kleines Problem, viel Text und wirrer Code..
Ich hoffe aber trotzdem, dass irgendjemand eine Idee hat was ich dagegen machen könnte..
Vielen Dank schonmal
LoD123

TheProgrammer

BeitragSo, Jul 22, 2007 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Speicher doch einfach deine Ordnerinhalte in Types. Am besten schreibst du dir eine Funktion, die sich ineinander verschachteln lässt, um alle Ordner zu durchsuchen.

Mfg
TheProgrammer
aktuelles Projekt: The last day of human being

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 23, 2007 1:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ihr macht es ganz schön kompliziert. Sowas programmiert man rekursiv. Hier mal ein kleines Beispiel

Code: [AUSKLAPPEN]
Global anzahl

;Einlesen
dirs("c:\windows") ;dirs(".")

Print anzahl+" Textdateien gefunden"
WaitKey
End




;Dateien-Suchen
Function dirs(pfad$)
 rdid=ReadDir(pfad$)
  Repeat
   datei$=Lower(NextFile$(rdid))
   If datei$<>"."
    If datei$<>".."
     If datei$="" Exit
     If FileType(pfad$+"\"+datei$)=2
      dirs(pfad$+"\"+datei$)
     Else
      If Right$(datei$,4)=".txt"
       Print pfad$+"\"+datei$
       anzahl=anzahl+1
      End If
     End If
    End If
   End If
  Forever
 CloseDir rdid
End Function

Das Programm durchsuch alles ab "c:\windows" nach .txt -Dateien. Will man z.B. von dem Verzeichnis aus durchsuchen, wo sich die Blitz.EXE bzw. die .BB befindet, so startet man die Funktion mit dirs(".")

Auf die globale Variable kann man verzichten, wenn man keine gefundene Anzahl wissen möchte.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

LoD123

BeitragDi, Jul 24, 2007 6:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Oha! An sowas hab ich noch gar net gedacht.
So isses wohl wirklich a weng unkomplizierter^^
Vielen Dank

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group