Bei großen Verzeichnisstrukturen Fehlermeldung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Bei großen Verzeichnisstrukturen Fehlermeldung

Beitrag von derRaab »

Hallo Leute,

dies ist mein erster Beitrag hier, also habt verständnis, wenn ich evtl. falsch poste bzw. eine Standardfrage stelle.

Ich habe ein kleines Programm geschrieben (bitte achtet nicht auf die GUI), mit dem ich aus einem Ordner und dessen Unterordnern mit der Funktion 'GetDirGaleryXML' rekursiv eine XML-Struktur erstelle. Dies funktioniert soweit schon recht gut, aber wenn ich das Programm auf meinen kompletten Bilderordner loslasse ( 100te Bilder / über 2 GB ) will mein Windows XP immer eine Fehlermeldung senden. Ich hatte zum Test in die rekursive Funktion auch ein Delay mit eingebaut, aber das hat nicht geholfen.

Nun weiß ich nicht so recht woran das liegen kann. Kann ich innerhalb PureBasic nur Strings bis zu einer gewissen größe verarbeiten? Oder sind die Zugriffe auf das Filesystem begrenzt?

Und noch eine weitere Frage: Kann man beim Speichern von Textdateien angeben, welchen Zeichensatz verwenden möchte? Konkret bräuchte ich UTF-8.

Hier der SourceCode des kleinen Programms:

Code: Alles auswählen

;
; Innerhalb eines ausgewählten Ordners anhand der Unterordner
; eine XML-Struktur für eine Flash-Bildergalerie erstellen
;


; VARIABLEN DEKLARIEREN
ExplorerTreeID.l
ButtonID.l
FolderPathTextID.l
EventID.l
GadgetID.l
FolderPath.s = ""
XML.s = ""


; Meldungen
Global noFolderMsg.s
noFolderMsg = "Bitte wählen Sie einen Ordner aus."
Global noValidFolderMsg.s
noValidFolderMsg = "Bitte wählen Sie einen gültigen Ordner aus."
Global success.s
success = "Datei 'gallery.xml' erfolgreich in folgendes Verzeichnis gespeichert :"
Global error.s
error = "Datei 'gallery.xml' konnte nicht gespeichert werden!"
Global error2.s
error2 = "Keine JPG bzw. SWF-Dateien gefunden."

; ToolTips
Global ExplorerTreeToolTip.s
ExplorerTreeToolTip = "Hier können Sie ein Verzeichnis auswählen"
Global ButtonToolTip.s
ButtonToolTip = "XML-Generierung starten"


; --------------------------------------------------------------------------------------------------------------------------

; PROZEDUREN

Procedure.s GetDirGaleryXML(dir.s, dirID.l)
  ; lokale Variablen
  Protected dirxml.s
  Protected subdirxml.s
  Protected entryName.s
  dirxml = ""
  Protected entryType.l
  Protected ext.s
  
  ; aktuelles Verzeichnis
  If ExamineDirectory(dirID, dir, "")
  
    ; alle Inhalte durcharbeiten
    Repeat
    
      ; Art des Inhaltes
      entryType = NextDirectoryEntry()
      ; Name des Inhaltes
      entryName = DirectoryEntryName()
      
      ; Art auswerten
      Select entryType
      
        ; wenn Ordner
        Case 2
         
          ; keine Ordnerverweise durchlaufen
          If entryName <> "." And entryName <> ".."
            
            ; untergeordnete Inhalte rekursiv auslesen
            subdirxml = GetDirGaleryXML(dir+ entryName + "\", dirID + 1)
            
            ; wenn Inhalte vorhanden - XML - Knoten erstellen
            If subdirxml <> ""
            
              dirxml + Chr(13)+ Chr(10) + LSet("", dirID, Chr(9)) + "<dir url='" + entryName + "'>" + subdirxml + Chr(13)+ Chr(10) + LSet("", dirID, Chr(9)) + "</dir>"
              
            EndIf
            
            ; Verzeichnis der aktuellen Ebene wieder verwenden
            UseDirectory(dirID)

          EndIf
          
        ; wenn Datei
        Case 1
        
          ; Dateityp ermitteln
          ext = LCase(GetExtensionPart(Dir$+DirectoryEntryName()))
          
          ; Nur JPG und SWF zulassen
          If ext = "jpg" Or ext = "swf"
          
            dirxml + Chr(13)+ Chr(10) + LSet("", dirID, Chr(9)) + "<img url='" + entryName + "' />"
            
          EndIf
          
        
      EndSelect
      
      ; kleine Pause
      ; Delay (10)
    
    Until entryType = 0
    
  EndIf

  ; Rückgabe
  ProcedureReturn dirxml
EndProcedure



; --------------------------------------------------------------------------------------------------------------------------


; bei erfolgreichem Öffnen des Fensters und erfolgreicher Erstellung der Komponentenliste
If OpenWindow(0, 100, 200, 550, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "XML-Generator") And CreateGadgetList(WindowID(0)) 


  ; Komponenten erstellen ------------------------------
  
  ; Explorerbaum mit Tooltip
  ExplorerTreeID = ExplorerTreeGadget( #PB_Any , 0 , 0 , 200 , 400 , ".\", #PB_Explorer_AlwaysShowSelection | #PB_Explorer_NoFiles )
  GadgetToolTip( ExplorerTreeID , ExplorerTreeToolTip ) 
    
  ; Button mit Tooltip
  ButtonID =  ButtonGadget( #PB_Any , 200 , 0 , 100 , 100 , "XML generieren" ) 
  GadgetToolTip( ButtonID , ButtonToolTip ) 
  
  ; Textfeld mit dem ausgewählten Ordner
  FolderPathTextID = StringGadget(#PB_Any, 200, 100, 200, 20, "")

  
  ; ------------------------------------------------ 
    

  ; Events abwarten
  Repeat
    EventID = WaitWindowEvent()
    
    ; Event auswerten
    Select EventID
    
      ; wenn ein Komponentenevent
      Case #PB_Event_Gadget
      
        ; Komponente ermitteln
        GadgetID = EventGadgetID()
        
        ; entsprechende Aktionen ausführen
        Select GadgetID
        
          ; Explorerbaum-Aktion
          Case ExplorerTreeID
          
            ; Pfad in Textfeld speichern
            SetGadgetText(FolderPathTextID, GetGadgetText(ExplorerTreeID))
          
          ; Button-Aktion
          Case ButtonID
          
            ; Ordner ermitteln
            FolderPath = GetGadgetText(FolderPathTextID)
            
            ; wenn Ordner angegeben
            If FolderPath
            
              ; Ordner prüfen
              If ExamineDirectory(0, FolderPath, "*.*")
              
                ; XML - Struktur erstellen  Chr(13)+ Chr(10) + LSet("", dirID, Chr(9)) + 
                XML = GetDirGaleryXML(FolderPath, 0)
                
                ; wenn Struktur
                If XML <> ""
                
                  ; XML komplettieren
                  XML + Chr(13) + Chr(10) + "</gallery>"
                  XML = Chr(13) + Chr(10) + "<gallery>" + Chr(13) + Chr(10) + XML
                  XML = Chr(13) + Chr(10) + "<!-- XML-Generator developed by Markus Raab http://www.derRaab.com -->" + XML
                  XML = "<?xml version='1.0' encoding='utf-8'?>" + XML
                  
                  ; Datei speichern
                  If CreateFile(0, FolderPath + "gallery.xml")
                  
                    WriteString(XML)
                    CloseFile(0)
                    MessageRequester("XML-Generator", success + FolderPath , 0)
                    
                  Else
                  
                    ; Datei konnte nicht geschrieben werden
                    MessageRequester("XML-Generator", error, 0)
                    
                  EndIf
                
                Else
                
                  ; keine gültigen Daten gefunden
                  MessageRequester("XML-Generator", error2, 0)

                EndIf
                
               
              Else 
                ; Fehlermeldung ausgeben
                MessageRequester("Achtung", noValidFolderMsg ,#PB_MessageRequester_Ok )
                
              EndIf
              
            Else
            
              ; Fehlermeldung ausgeben
              MessageRequester("Achtung", noFolderMsg ,#PB_MessageRequester_Ok )
            
            EndIf

        
        EndSelect
        
        GadgetID = 0
    
    EndSelect
    
  
  ; bis zum Schließen des Fensters
  Until EventID = #PB_Event_CloseWindow

EndIf
Danke schon jetzt...

Werde ab jetzt wohl öfter mal da sein!

raab

:mrgreen:
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Bei großen Verzeichnisstrukturen Fehlermeldung

Beitrag von Kiffi »

> Kann ich innerhalb PureBasic nur Strings bis zu einer gewissen größe
> verarbeiten?

da wird wohl der Hase im Pfeffer liegen. PB unterstützt standardmässig nur
Stringlängen von knapp 64000 Zeichen. Teste doch einfach mal mit
Len(DeinString$), wie lang Dein String ist.

Im englischen Forum gibt's einen Hack, der es ermöglicht, Strings über 64K
zu verwenden: http://purebasic.myforums.net/viewtopic.php?t=9194

> Oder sind die Zugriffe auf das Filesystem begrenzt?

nicht, dass ich wüsste...

> Und noch eine weitere Frage: Kann man beim Speichern von Textdateien
> angeben, welchen Zeichensatz verwenden möchte? Konkret bräuchte ich
> UTF-8.

mmh, Du meinst doch eigentlich das Speichern von XML-Dateien, oder?
Dann kannst Du (vorausgesetzt Du bleibst beim String-Zusammenbasteln)
einfach ein

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
vorne an Deinen String anhängen.

Grüße ... Kiffi
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Danke Kiffi!

Genau das war es.... :)

Super :allright:
Antworten