Verzeichnis einlesen und vergleichen

Anfängerfragen zum Programmieren mit PureBasic.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Verzeichnis einlesen und vergleichen

Beitrag von Micro »

Hallo Leute,

ich bekomme mal wieder was nicht hin. Folgendes Problem habe ich:

Ich möchte ein Verzeichnis einlesen, wo viele Dateien drin sind.
Diese Dateien sind in Sätze gegliedert, die zu einem Artikel gehören. Beispiel:
01-006745.013-a Artikelliste.pdf
01-006745.013-a Teileliste.pdf
01-006745.013-a.dxf
01-006745.013-b Artikelliste.pdf
01-006745.013-b Teileliste.pdf
01-006745.013-b.dxf
01-006746.013 Artikelliste.pdf
01-006746.013 Teileliste.pdf
01-006746.013.dxf
01-006746.013-a Artikelliste.pdf
01-006746.013-a Teileliste.pdf
01-006746.013-a.dxf
01-006746.013-b Artikelliste.pdf
01-006746.013-b Teileliste.pdf
01-006746.013-b.dxf

Wie Ihr seht, sind es zwei Artikel, unschwer an der 13-stelligen Artikelnummer zu erkennen. Diese Dateien unterscheiden sich nur in der Revision, gekennzeichnet aufsteigend mit "-a", "-b", aber zum Beispiel auch "-aa" oder "-gh".
Nun möchte ich die älteren Dateien eines Artikels in ein Sicherungsverzeichnis (ein Unterverzeichnis innerhalb des Verzeichnisses) verschieben. Zum Beispiel soll dann in dem Verzeichnis von dem Artikel 01-006746.013 nur die Dateien mit der Erweiterung "-b" in dem Verzeichnis bleiben. Wie bekomme ich das am besten hin?
Hinweis: Es kann auch vorkommen, das die Datei den Namen 01-006746.013-sz Artikelliste.pdf exestiert.

Hier mal den Code, den ich mir bis jetzt zusammengestrickt habe:

Code: Alles auswählen

Procedure ListFiles(Pfadangabe.s, Verzeichnisangabe.s)
  Pfadangabe.s + "\"
  UsedDirectory.l = ExamineDirectory(#PB_Any, Pfadangabe.s, "*.*")
  While NextDirectoryEntry(UsedDirectory.l)
    EntryType.l = DirectoryEntryType(UsedDirectory.l)
    EntryName.s = DirectoryEntryName(UsedDirectory.l)
    If EntryName.s = "." Or EntryName.s = "..": Continue: EndIf
    If EntryType.l = #PB_DirectoryEntry_File
      Debug "File: " + Pfadangabe.s + EntryName.s
    EndIf
    If EntryType.l = #PB_DirectoryEntry_Directory: ListFiles(Pfadangabe.s + EntryName.s, Verzeichnisangabe.s): EndIf
  Wend: FinishDirectory(UsedDirectory.l)
EndProcedure

ListFiles("D:\Beispiel Daten", "Sicherungsverzeichnis"
Habt Ihr da eine Lösung?


Vielen Dank, Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Verzeichnis einlesen und vergleichen

Beitrag von edel »

Du koenntest das mit regex loesen

z.b.

Code: Alles auswählen

Procedure.s mirfaelltgradkeinnameein(string.s)
  
  string = ReplaceString(string,".","\.")
  string = ReplaceString(string,"-","\-")
  
  ProcedureReturn string
EndProcedure


Procedure ListFiles(Pfadangabe.s, Verzeichnisangabe.s, Artikel.s, Version.s)
  Protected rx 
  
  
  Artikel = mirfaelltgradkeinnameein(Artikel)
  
  rx = CreateRegularExpression(#PB_Any,Artikel+"\-" + Version + ".*")
  
  If Not rx
    ProcedureReturn 0
  EndIf
  
  
  Pfadangabe.s + "\"
  UsedDirectory.l = ExamineDirectory(#PB_Any, Pfadangabe.s, "*.*")
  If UsedDirectory 
    While NextDirectoryEntry(UsedDirectory.l)
      EntryType.l = DirectoryEntryType(UsedDirectory.l)
      EntryName.s = DirectoryEntryName(UsedDirectory.l)
      If EntryName.s = "." Or EntryName.s = "..": Continue: EndIf
      If EntryType.l = #PB_DirectoryEntry_File
        
        
        ;If FindString(EntryName, Artikel, 1)
          
          If MatchRegularExpression(rx, EntryName)
            Debug "File: " + Pfadangabe.s + EntryName.s
          Else
            Debug "----- verschieben -> File: " + Pfadangabe.s + EntryName.s
          EndIf
          
        ;EndIf
        
        
      EndIf
      If EntryType.l = #PB_DirectoryEntry_Directory: ListFiles(Pfadangabe.s + EntryName.s, Verzeichnisangabe.s, Artikel.s, Version.s): EndIf
    Wend: FinishDirectory(UsedDirectory.l)
  EndIf
  
  FreeRegularExpression(rx)
  
EndProcedure

ListFiles("D:\Beispiel Daten", "Sicherungsverzeichnis","01-006745.013","b")


Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Verzeichnis einlesen und vergleichen

Beitrag von NicTheQuick »

Und immer daran denken. Folge Zeile ist falsch:

Code: Alles auswählen

UsedDirectory.l = ExamineDirectory(#PB_Any, Pfadangabe.s, "*.*")
Richtig wäre

Code: Alles auswählen

UsedDirectory.i = ExamineDirectory(#PB_Any, Pfadangabe.s, "*.*")
Der Unterschied ist, dass UsedDirectory jetzt ein Integer ist. Bleibst du bei Long und wird das Programm als 64-Bit-Version kompiliert wird die Id nicht mehr in den Long passen. Die Ids, die PB-Funktionen unter Verwendung von #PB_Any zurückgeben, sind nämlich nichts anderes als Pointer (Zeiger). Und die sind immer so groß wie die Bit-Zahl, für die kompiliert wurde.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Verzeichnis einlesen und vergleichen

Beitrag von WPö »

Moin!

Da Deine Suffixe wie bei Ziffern auch ein- und mehrstellig vorkommen können, würde ich allein zum Sortieren und damit Ermitteln der letzten Version das Suffix rechtsbündig machen. Da Du kaum mehr als 1+26²=677 Versionen eines Dokumentensatzes haben wirst, mußt Du nur das Suffix, wenn es einstellig ist, mit einem Leerzeichen davor versehen. Da wird die Sortierung dann richtig vorgenommen.

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Antworten