Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Demian am 14.12.08 - 18:57:06
-
Moin,moin,
ich will mir eine Datenbank machen, in der ich meine Amiga Spiele und Programme verwalte und sichere.
Jetzt bin ich gerade dabei mit einen Agenten zu schreiben, der mir aus einem "Stamm"-Verzeichnis alle Diskettenimages an ein Notesdokument hängt.
Der Ordner ist so aufgebaut, dass er pro Spiel einen Ordner enthält, der wiederum die einzelnen Image-Dateien enthält. Es gibt jedoch einzelne Ordner, die wiederum Unterordner mit den Image-Dateien enthalten, weil es zu der "Spielserie" mehrere Teile gibt.
Zum Beispiel:
Spiele\Ambermoon\Disk1.adf <= betrifft die meisten Spiele
Spiele\Indiana Jones\the last crusade\Disk1.adf <= Spiel mit mehreren Teilen
Spiele\Indiana Jones\the Fate of Atlantis\Disk1.adf <= Spiel mit mehreren Teilen
Ich habe bisher noch nie mit solchen Verzeichnis-Abfragen unter Notes gearbeitet. Mein erstes Problem ist, dass ich nur an den Dateinamen des ersten Spiels komme. Mein Codeauschnitt:
Dim pathName As String, GameName As String, FileName as string
pathName$ = "C:\Spiele\"
GameName$ = Dir$(pathName$, 16)
Do While GameName$ <> ""
If Left(Gamename$,1) <> "." Then
FileName$ = Dir$(pathname$ & Gamename$ & "\",0)
Do While FileName$ <> ""
Print GameName$ & " - " & FileName$
FileName$ = Dir$()
Loop
End If
GameName$ = Dir$()
Loop
Sobald die 2. Do While Schleife einmal durchgelaufen ist, kommt bei GameName$ = Dir$() ein Ungültiger Funktionsaufruf. Was mich auch irritiert bei GameName$ = Dir$(pathName$, 16) kommt beim 1. Lauf "." und beim 2. Lauf ".." raus, erst beim 3. Durchlauf kommt das erste richtige Verzeichnis??? Was hat es mit diesen beiden Punkt-Verzeichnissen auf sich?
Gruß
Demian
-
Naja "." ist das Verzeichnis selbst. Und ".." ist das Verzeichnis zu dem das aktuelle Verzeichnis Unterverzeichnis ist.
-
Ok, hab das mit den Dateien jetzt über ne 2. Schleife gelöst. Wenn auch unschön. Jetzt bleibt nur noch das Problem mit den Unterverzeichnissen.
Dim pathName As String, GameName As String, FileName As String, Gamepath As String
Dim GameVerzArr() As String
Dim i As Integer
pathName = "C:\Dokumente und Einstellungen\Demian\Eigene Dateien\Amiga\Original\Disketten\Spiele\"
GameName = Dir$(pathName, 16)
'Spielverzeichnisse in Array speichern
Do While GameName <> ""
If Left(GameName,1) <> "." Then
Redim Preserve GameVerzArr(i)
GameVerzArr(i) = GameName
Print GameVerzArr(i)
i = i + 1
End If
GameName$ = Dir$()
Loop
'Alle Verzeichnisse in Array durchlaufen und Dateien filtern
For i = 0 To Ubound(GameVerzArr)
GamePath = "C:\Dokumente und Einstellungen\Demian\Eigene Dateien\Amiga\Original\Disketten\Spiele\" & GameVerzArr(i) & "\"
Filename = Dir$(GamePath,0)
Do While Filename <> ""
Print Filename
Filename = Dir$()
Loop
Next i
Gruß
Demian
-
Also, ich habe das jetzt um folgende Funktion erweitert:
Function SubDirectory(Gamepath As String) As Boolean
Dim SubDirectoryName As String
SubDirectoryName = Dir$(GamePath, 16)
Do While SubDirectoryName <> ""
Msgbox SubDirectoryName
SubDirectoryName = Dir$()
Loop
End Function
Leider enthält die Variable SubDirectoryName die einzelnen Dateinamen, wenn in dem Ordner Gamepath keine Unterordner sind ??? Wenn Unterordner vorhanden sind, gibt er die auch aus. Ist nicht durch die 16 im ersten Dir$ gegeben, dass er bei SubDirectoryName = Dir$() auch nur Verzeichnisse auswirft und nicht die einzelnen Dateien?
Gruß
Demian
-
So, hab jetzt nach einer kurzen Pause folgenden Agenten erstellt (es lebe Windows-Scripting):
Declarations
Dim DiskName As String
Dim DiskChapter As String
Sub Initialize
Dim fs As Variant
Dim MainFolder As Variant
Set fs = CreateObject("Scripting.FileSystemObject")
Set MainFolder = fs.GetFolder("C:\Test\")
Call ListDirs(MainFolder)
End Sub
Sub ListDirs(Directory As Variant)
Dim Disks As Integer, Number As Integer
Goto DiskCounter
Main:
Forall File In Directory.Files
Number = Number + 1
If Instr(1,file.path,".adf",1) > 0 Then Call CreateDisk(file.path,Disks,Number)
End Forall
Forall SubDir In Directory.SubFolders
Print SubDir.path
ListDirs SubDir
End Forall
Exit Sub
DiskCounter:
Forall File In Directory.Files
If Instr(1,file.path,".adf",1) > 0 Then Disks = Disks + 1
End Forall
Goto Main
End Sub
Function DiskNameAndChapter(FilePath As String) As String
Dim MainSeparator As Integer, NameSeparator As Integer,ChapterSeparator As Integer
MainSeparator = Instr(4,FilePath,"\") '<- main path ("C:\Spiele\")
NameSeparator = Instr(MainSeparator + 1,FilePath,"\") '<- DiskName
ChapterSeparator = Instr(NameSeparator + 1,FilePath,"\") '<- DiskChapter
DiskName = Mid(FilePath,MainSeparator + 1 ,NameSeparator - MainSeparator - 1)
If ChapterSeparator > 0 Then
DiskChapter = Mid(FilePath,NameSeparator + 1 ,ChapterSeparator - NameSeparator - 1)
End If
End Function
Sub CreateDisk(FilePath As String,Disks As Integer,Number As Integer)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim DiskImage As NotesRichTextItem
Set db = s.CurrentDatabase
Set doc = db.CreateDocument
doc.Form = "Disk"
doc.DiskCategory = "0"
Call DiskNameAndChapter(FilePath)
doc.DiskName = DiskName
If DiskChapter <> "" Then doc.DiskChapter = DiskChapter
doc.DiskTotalCount = Disks
doc.DiskNumber = Number
doc.DiskImageCreated = "1"
Set DiskImage = doc.CreateRichTextItem("DiskImage")
Call DiskImage.EmbedObject(1454,"",FilePath)
doc.DiskCondition = "1"
Call doc.Save(True,False)
End Sub
Für meine Zwecke ausreichend. Soviel Aufwand für einmale Benutzung. Aber Hauptsache er tuts. Immer noch besser, als hunderte Doks per Hand zu erstellen ;D
Gruß
Demian