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
Werde ab jetzt wohl öfter mal da sein!
raab