Ordnersystem wie bei Windows

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

a14xerus hat geschrieben:
scholly hat geschrieben:Die Sig müßte doch in allen seiner Post auftauchen, oder?
nöö.. man kann einstellen ob die sig im post stehen soll ;)
Für jedes einzelne Posting? Ich dachte das gilt dann für alle :o
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Und vor allem kann man seine Signatur auch einfach leer lassen.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Und vor allem kann man jetzt auch aufhören über Signatur-Funktionen in einem PHPBB Board zu labern.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

@Vermilion:
Dann wart mal ab, bis von Dir der 4. wissen will, was für eine PB-Version Du fährst :lol:

@X0r:
Abba nich, wenner hilfreiche Geister veräppelt.
Zuletzt geändert von scholly am 21.04.2008 21:34, insgesamt 2-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

@Vermilion:

Welche PB Version hast du?
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

Beitrag von NicTheQuick »

Und was ist an meiner Methode jetzt so kompliziert gewesen?

Man schnappe sich eine TreeLinkedList, von denen es genügend hier im
Forum gibt und passe sie ein wenig für PB V3.3 an.

Oder man nehme zum Beispiel folgende Struktur und baue die Procedures
drumherum. Einen Parser schreiben finde ich ein bisschen überzogen, und vor allem langsam.

Code: Alles auswählen

; celements --- FS --- *files --> FS_ARRAY --- e[n] --> FS_ELEMENT
;                                                            |
;                                                            |-- type
;                                                            |
;                                                            |-- file --> FS_FILE --- name
;                                                            |
;                                                            '-- folder --> FS_FOLDER
;                                                                               |
;                                                                               |-- name
;                                                                               |-- celements
;                                                                               '-- *files --> (FS_ARRAY)

Structure FS_FILE
  *name.StringP    ;siehe meine StringPointer-Include
EndStructure

Structure FS_FOLDER
  *name.StringP
  celements.l
  *files.FS_ARRAY
EndStructure

Structure FS_ELEMENT
  type.l
  StructureUnion 
    *file.FS_FILE
    *folder.FS_FOLDER
  EndStructureUnion
EndStructure

Structure FS_ARRAY
  e[0].FS_ELEMENT
EndStructure

Structure FS
  celements.l
  *files.FS_ARRAY
EndStructure
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

Beitrag von NicTheQuick »

Hab jetzt eine Kleinigkeit gebastelt. Nur das in Dateien schreiben konnte ich
jetzt noch nicht testen. Da hab ich gerade zu wenig Zeit für.

Code: Alles auswählen

Enumeration
  #FS_File
  #FS_Folder
EndEnumeration

Structure FS_ELEMENT
  type.l
  *name
  *folder.FS_FOLDER
EndStructure

Structure FS_ARRAY
  e.FS_ELEMENT[0]
EndStructure

Structure FS_FOLDER
  celements.l
  *files.FS_ARRAY
  *eparent.FS_ELEMENT
  *parent.FS_FOLDER
EndStructure

Procedure FS_New()
  Protected *FS.FS_FOLDER
  
  *FS = AllocateMemory(SizeOf(FS_FOLDER))
  
  ProcedureReturn *FS
EndProcedure

Procedure.l FS_Count(*FS.FS_FOLDER)
  ProcedureReturn *FS\celements
EndProcedure

Procedure.l FS_NewFile(*FS.FS_FOLDER, name.s)
  Protected *tmp, *name
  
  *name = AllocateMemory(Len(name) + 1)
  If Not *name : ProcedureReturn #False : EndIf
  
  *tmp = ReAllocateMemory(*FS\files, (*FS\celements + 1) * SizeOf(FS_ELEMENT))
  If Not *tmp : FreeMemory(*name) : ProcedureReturn #False : EndIf
  
  *FS\files = *tmp
  With *FS\files\e[*FS\celements]
    \type = #FS_File
    \name = *name
    PokeS(\name, name)
    \folder = 0
  EndWith
  
  *FS\celements + 1
  
  ProcedureReturn *FS\celements
EndProcedure

Procedure.l FS_NewFolder(*FS.FS_FOLDER, name.s)
  Protected *tmp, *name, *folder
  
  *name = AllocateMemory(Len(name) + 1)
  If Not *name : ProcedureReturn #False : EndIf
  
  *folder = AllocateMemory(SizeOf(FS_FOLDER))
  If Not *folder : FreeMemory(*name) : ProcedureReturn #False : EndIf
  
  *tmp = ReAllocateMemory(*FS\files, (*FS\celements + 1) * SizeOf(FS_ELEMENT))
  If Not *tmp : FreeMemory(*name) : FreeMemory(*folder) : ProcedureReturn #False : EndIf
  
  *FS\files = *tmp
  *FS\files\e[*FS\celements]\type = #FS_Folder
  *FS\files\e[*FS\celements]\name = *name
  PokeS(*FS\files\e[*FS\celements]\name, name)
  *FS\files\e[*FS\celements]\folder = *folder
  *FS\files\e[*FS\celements]\folder\parent = *FS
  *FS\files\e[*FS\celements]\folder\eparent = *FS\files\e[*FS\celements]
  
  *FS\celements + 1
  
  ProcedureReturn *folder
EndProcedure

Procedure FS_OpenFolder(*FS.FS_FOLDER, position.l)
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  If *FS\files\e[position]\type <> #FS_Folder : ProcedureReturn #False : EndIf
  
  ProcedureReturn *FS\files\e[position]\folder
EndProcedure

Procedure FS_CloseFolder(*FS.FS_FOLDER)
  If Not *FS\parent : ProcedureReturn #False : EndIf
  
  ProcedureReturn *FS\parent
EndProcedure

Procedure FS_Delete(*FS.FS_Folder, position.l)
  Protected i.l
  
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  FreeMemory(*FS\files\e[position]\name)
  
  If *FS\files\e[position]\type = #FS_Folder
    For i = 0 To *FS\files\e[position]\folder\celements - 1
      FS_Delete(*FS\files\e[position]\folder, i)
    Next
  EndIf
  
  *FS\celements - 1
  
  While position < *FS\celements
    *FS\files\e[position]\type = *FS\files\e[position + 1]\type
    *FS\files\e[position]\name = *FS\files\e[position + 1]\name
    *FS\files\e[position]\folder = *FS\files\e[position + 1]\folder
    position + 1
  Wend
  
  If *FS\celements
    *FS\files = ReAllocateMemory(*FS\files, *FS\celements * SizeOf(FS_ELEMENT))
  Else
    FreeMemory(*FS\files)
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure.s FS_Name(*FS.FS_Folder, position.l)
  If position < 0 Or position >= *FS\celements : ProcedureReturn "" : EndIf
  
  ProcedureReturn PeekS(*FS\files\e[position]\name)
EndProcedure

Procedure FS_SetName(*FS.FS_FOLDER, position.l, name.s)
  Protected *tmp
  
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  *tmp = ReAllocateMemory(*FS\files\e[position]\name, Len(name) + 1)
  If Not *tmp : ProcedureReturn #False : EndIf
  
  *FS\files\e[position]\name = *tmp
  
  PokeS(*FS\files\e[position]\name, name)
  
  ProcedureReturn #True
EndProcedure

Procedure FS_Type(*FS.FS_FOLDER, position.l)
  If position < 0 Or position >= *FS\celements : ProcedureReturn #False : EndIf
  
  ProcedureReturn *FS\files\e[position]\type
EndProcedure

CompilerIf 0

Macro ReadData(a, b)
  ReadData(0, a, b)
EndMacro
Macro ReadLong()
  ReadLong(0)
EndMacro
Macro WriteLong(a)
  WriteLong(0, a)
EndMacro
Macro WriteString(a)
  WriteString(0, a)
EndMacro

Procedure FS_Write(*FS.FS_FOLDER)
  Protected i.l
  
  WriteLong(*FS\celements)
  For i = 0 To *FS\celements - 1
    WriteLong(*FS\files\e[i]\type)
    WriteLong(Len(*FS\files\e[i]\name))
    WriteString(PeekS(*FS\files\e[i]\name))
    If *FS\files\e[i]\type = #FS_Folder
      FS_Write(*FS\files\e[i]\folder)
    EndIf
  Next
EndProcedure

Procedure FS_Read(*FS.FS_FOLDER)
  Protected c.l, i.l, type.l, length.l, name.s, *tmp
  
  If Not *FS
    *FS = AllocateMemory(SizeOf(FS_FOLDER))
    If Not *FS : ProcedureReturn #False : EndIf
  EndIf
  
  c = ReadLong() - 1
  For i = 0 To c
    type = ReadLong()
    length = ReadLong()
    name = Space(length)
    ReadData(@name, length)
    Select type
      Case #FS_File
        If Not FS_NewFile(*FS, name) : ProcedureReturn #False : EndIf
      Case #FS_Folder
        *tmp = FS_NewFolder(*FS, name)
        If *tmp
          If Not FS_Read(*tmp) : ProcedureReturn #False : EndIf
        EndIf
    EndSelect
  Next
  
  ProcedureReturn #True
EndProcedure
CompilerEndIf

Procedure.s FS_Path(*FS.FS_FOLDER, position.l)
  Protected path.s = "\"
  
  If position >= 0 And position < *FS\celements
    path + PeekS(*FS\files\e[position]\name)
  EndIf
  
  While *FS\parent And *FS\eparent
    path = "\" + PeekS(*FS\eparent\name) + path
    *FS = *FS\parent
  Wend
  
  ProcedureReturn path
EndProcedure

Procedure FS_Debug(*FS.FS_FOLDER)
  Protected c.l, i.l
  
  For i = 0 To FS_Count(*FS) - 1
    Select FS_Type(*FS, i)
      Case #FS_File
        Debug FS_Path(*FS, i)
      
      Case #FS_Folder
        Debug FS_Path(*FS, i) + "\"
        FS_Debug(FS_OpenFolder(*FS, i))
    EndSelect
  Next
EndProcedure

Define *FS.FS_FOLDER

*FS = FS_New()

;1 Datei und 2 Order anlegen
FS_NewFile(*FS, "autoexec.bat")
FS_NewFolder(*FS, "Programme")
FS_NewFolder(*FS, "Windows")
  ;Ordner an Position 2 öffnen
  *FS = FS_OpenFolder(*FS, 2)
  ;2 Dateien und 1 Ordner anlegen
  FS_NewFile(*FS, "win.com")
  FS_NewFile(*FS, "win.ini")
  FS_NewFolder(*FS, "Temp")
    ;Ordner an Position 2 öffnen
    *FS = FS_OpenFolder(*FS, 2)
    ;2 Dateien anlegen
    FS_NewFile(*FS, "tempdatei.dat")
    FS_NewFile(*FS, "altes setup.exe")
    ;Ordner wieder schließen
    *FS = FS_CloseFolder(*FS)
  ;Ordner wieder schließen
  *FS = FS_CloseFolder(*FS)

FS_Debug(*FS)
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Für XOr und Scholly: Immer die neueste. Fertig. Kann man sich doch denken... wenn nichts anderes da steht, dann die default antwort.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

>Für XOr und Scholly: Immer die neueste. Fertig. Kann man sich doch denken... wenn nichts anderes da steht, dann die default antwort.

Aha. Das sagt der richtige. Du selber hast zur PB 4.1 Beta Zeit PB 4.00 genutzt. /:->
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Ja, weil ich Betas nicht benutze (Standardmäßig). Nur fertige Versionen. Und von diesen winzigen Änderungen von 4.00 und 4.02 habe ich halt zuerst nichts mitgekriegt.
Antworten