Dateisystemfunktionen, objektorientiert

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

hamZta

Administrator

Betreff: Dateisystemfunktionen, objektorientiert

BeitragDi, Sep 22, 2009 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Hab mich mal drangemacht das Dateisystemzeugs von BlitzMax in Types zu verpacken (weil ich's ekelhaft fand, dass ReadDir ein Integer-Handle zurückgegeben hat Wink ).

Wer's braucht kann's gern benutzen, war nicht viel Arbeit:
BlitzMax: [AUSKLAPPEN]
Type TDirEnum

Field _dir:Int
Field _path:String
Field _stripParent:Int
Field _fileTmp:TFile
Field _filter:Byte

Method HasNext:Int()
Local name:String = NextFile(_dir)

If _stripParent
While name = "." Or name = ".."
name = NextFile(_dir)
Wend
End If

While Not (FileType(_path + "/" + name) & _filter) And name <> ""
name = NextFile(_dir)
Wend

_fileTmp = TFile.Open(_path + "/" + name)
Return (name <> "")
End Method

Method NextObject:Object()
Return _fileTmp
End Method

Method Delete()
CloseDir(_dir)
End Method

End Type

Type TFile
Field _name:String
Field _path:String
Field _fullPath:String
Field _type:Int
Field _stripParent:Int
Field _filter:Byte

Function Open:TFile(path:String)
Local dir:TFile = New TFile

?Win32
If path.EndsWith("\\") path = path[..path.length - 1]
?Linux
If path.EndsWith("/") path = path[..path.length - 1]
?MacOs
If path.EndsWith("/") path = path[..path.length - 1]
?

dir._type = FileType(path)
dir._name = StripDir(path)
dir._path = ExtractDir(path)
dir._fullPath = path
dir._filter = FILETYPE_FILE|FILETYPE_DIR
Return dir
End Function

Method Name:String()
Return _name
End Method

Method Path:String()
Return _fullPath
End Method

Method ParentDirectory:String()
Return _path
End Method

Method Typ:Int()
Return _type
End Method

Method Mode:Int()
Return FileMode(_fullPath)
End Method

Method Size:Int()
Return FileSize(_fullPath)
End Method

Method Time:Int()
Return FileTime(_fullPath)
End Method

Method ObjectEnumerator:TDirEnum()
If _type <> FILETYPE_DIR Return Null

Local enum:TDirEnum = New TDirEnum
enum._dir = ReadDir(_fullPath)
enum._path = _fullPath
enum._stripParent = _stripParent
enum._filter = _filter
Return enum
End Method

Method stripParent()
_stripParent = True
End Method

Method Filter(f:Byte)
_filter = f
End Method

Method Extension:String()
Return ExtractExt(_name)
End Method

Method Rename(newName:String)
RenameFile(_fullPath, _path + "/" + newName)
_fullPath = _path + "/" + newName
_name = newName
End Method

Method SetMode(mode:Byte)
SetFileMode(_fullPath, mode)
End Method

Method Write:TStream()
If _type <> FILETYPE_FILE Return Null

Return WriteFile(_fullPath)
End Method

Method Read:TStream()
If _type <> FILETYPE_FILE Return Null

Return ReadFile(_fullPath)
End Method

Method Content:String[]()
If _type <> FILETYPE_DIR Return Null

Return LoadDir(_fullPath)
End Method

End Type


Beispiel:

Findet rekursiv alle Dateien und Verzeichnisse die nach dem 22. September, 18:15 erstellt wurden:
BlitzMax: [AUSKLAPPEN]
Local md:TFile = TFile.Open("C:\Users\Fabian\Downloads")
md.stripParent()
printDir(md)

Function printDir(d:TFile)
For Local file:TFile = EachIn d
If file.Time() >= 1253636100 Print "File: " + file.Path()

If file.Typ() = FILETYPE_DIR
Local dir:TFile = TFile.open(file.path())
dir.stripParent()
printDir(dir)
End If

Next
End Function


Verzeichnisse kann man einfach per "For ... EachIn" durchlaufen, hab ich mir bei TList geklaut Wink

Schönen Abend!
hamZta
Blog.
  • Zuletzt bearbeitet von hamZta am Di, Sep 29, 2009 1:29, insgesamt 2-mal bearbeitet

FireballFlame

BeitragDo, Sep 24, 2009 6:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Müsste denn die Extension-Methode nicht Code: [AUSKLAPPEN]
   Method Extension:String()
      Return ExtractExt(_name)
   End Method
lauten?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

hamZta

Administrator

BeitragDo, Sep 24, 2009 9:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Holla, selbstverständlich.

Danke dir!
Blog.

DaysShadow

BeitragDo, Sep 24, 2009 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Superstrict müsste TDirEnum.HasNext() einen Int oder Byte zurückgeben und kann es sein dass die TFile.Delete() Methode da gar nichts zu suchen hat, _dir gibt es nicht in TFile? ^^

Ansonsten gute Sache Wink

MfG DaysShadow
Blessed is the mind too small for doubt

FireballFlame

BeitragFr, Sep 25, 2009 4:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt...
Ich habe, um zu lernen, wie man in BlitzMax Module macht, einfach mal aus deinem Code eins gebaut, und die von DaysShadow genannten Sachen sind mir dabei auch aufgefallen.
HasNext muss Int sein (warum hat Bmax eigentlich kein Boolean?), aber wozu war der Destruktor gut?

hamZta

Administrator

BeitragDi, Sep 29, 2009 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
DaysShadow hat Folgendes geschrieben:
Für Superstrict müsste TDirEnum.HasNext() einen Int oder Byte zurückgeben und kann es sein dass die TFile.Delete() Methode da gar nichts zu suchen hat, _dir gibt es nicht in TFile?


Besten Dank, wurde korrigiert. Kommt davon, wenn man's nicht nochmal testet vor dem Abschicken ...

Der Destruktor ist nur ein Relikt aus einer früheren Version, da war _dir noch ein Member, das Verzeichnis wurde sofort in der Methode Open geöffnet.

hamZta
Blog.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group