forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=28)
-   -   Банк файлов (http://forum.boolean.name/showthread.php?t=18451)

impersonalis 11.08.2013 19:09

Банк файлов
 
Основное назначение: просканировать указанные директории на предмет указанных форматов данных, и сохранить результаты для последующей обработки - как в порядке, установленном ФС, так и в произвольном.
Например, так можно организовать микширование фоновой музыки в игре, или случайный выбор из набора однотипных текстур.
Делайте с кодом что хотите. За упоминание - буду благодарен.
Код:

;==================
;TFileBank
;created by impersonalis (ICQ# 11-999-51-51)
;http://forum.boolean.name/
;==================

;TFileBank_Create.TFileBank()
;Создать банк имён файлов

;TFileBank_GetReadN(TFB.TFileBank)
;Вернуть - сколько файлов прочитано

;TFileBank_Add(TFB.TFileBank,fldr$)
;Добавить директорию

;TFileBank_AddExt(TFB.TFileBank,OneExt$)
;Добавить расширение

;TFileBank_Clear(TFB.TFileBank)
;Очистить список файлов

;TFileBank_ClearExts(TFB.TFileBank)
;Очистить список расширений

;TFileBank_Delete(TFB.TFileBank)
;Уничтожить банк

;TFileBank_Randomize(TFB.TFileBank)
;Пермешать файлы

;TFileBank_GetRnd.TFileBank_OneFile(TFB.TFileBank)
;Вернуть случайны файл (экземпляр TFileBank_OneFile)

;TFileBank_Get.TFileBank_OneFile(TFB.TFileBank,id%)
;Вернуть файл №...

;TFileBank_GetRndFileName$(TFB.TFileBank)
;Вернуть имя случайного файла

Type TFileBank
        Field FilBnk%
        Field ExtBnk%
        Field ReadOk%
        Field CurPos%
End Type

Const TFileBank_OneFile_CNST__TEMPLATE%=1
Const TFileBank_OneFile_CNST__FREE%=2
Const TFileBank_OneFile_CNST__SLAVE%=3

Type TFileBank_OneFile
        ;===
        Field shortname$
        Field fullname$
        Field ext$
        ;===
        Field ID%
        ;===
        Field ST%
End Type

Function TFileBank_OneFile_Create.TFileBank_OneFile(ST%)
        Local TFB_OF.TFileBank_OneFile=New TFileBank_OneFile
        TFB_OF\ST=ST
        TFB_OF\ID=-1
        Return TFB_OF
End Function

Function TFileBank_OneFile_Delete(TFB_OF.TFileBank_OneFile)
        Delete TFB_OF
End Function

Function TFileBank_Create.TFileBank()
        Local TFB.TFileBank=New TFileBank
        TFB\FilBnk=CreateBank(0)
        TFB\ExtBnk=CreateBank(0)
        TFB\ReadOk=0
        TFB\CurPos=0
        Return TFB
End Function

Function TFileBank_GetReadN(TFB.TFileBank)
        Return TFB\ReadOk
End Function

Function TFileBank_Add(TFB.TFileBank,fldr$)
        Local D%=ReadDir(fldr)
        Local FileName$
        Local FullFileName$
        Local CurBnkSize%=BankSize(TFB\FilBnk)
        While True
                FileName=NextFile(D)
                If FileName="" Exit
                FullFileName=fldr+"\"+FileName
                If FileType(FullFileName)=1
                        Local L%=Len(FileName)
                        Local ExtI%
                        For ExtI=L To 1 Step -1
                                If Mid(FileName,ExtI,1)="."
                                        Exit
                                EndIf
                        Next
                        If ExtI>1
                                Local EXT$=Upper(Right(FileName,L-ExtI))
                                Local TMPL.TFileBank_OneFile
                                Local Ok=False
                                For ExtJ=0 To BankSize(TFB\ExtBnk)-1 Step 4
                                        TMPL=Object.TFileBank_OneFile(PeekInt(TFB\ExtBnk,ExtJ))
                                        If TMPL\ext=EXT
                                                Ok=True
                                                Exit
                                        EndIf
                                Next
                                If Ok
                                        TFB\ReadOk=TFB\ReadOk+1
                                       
                                        TFB_OF.TFileBank_OneFile=TFileBank_OneFile_Create(TFileBank_OneFile_CNST__FREE)
                                        TFB_OF\shortname=FileName
                                        TFB_OF\fullname=FullFileName
                                        TFB_OF\ext=EXT
                                        TFB_OF\ID=TFB\ReadOk
                                EndIf
                        EndIf
                EndIf
        Wend
        CloseDir(D)
        ResizeBank(TFB\FilBnk,TFB\ReadOk*4)
        For TFB_OF=Each TFileBank_OneFile
                If TFB_OF\ST=TFileBank_OneFile_CNST__FREE
                        TFB_OF\ST=TFileBank_OneFile_CNST__SLAVE
                        PokeInt(TFB\FilBnk,CurBnkSize,Handle(TFB_OF))
                        CurBnkSize=CurBnkSize+4
                EndIf
        Next
End Function

Function TFileBank_AddExt(TFB.TFileBank,OneExt$)
        TFB_OF.TFileBank_OneFile=TFileBank_OneFile_Create(TFileBank_OneFile_CNST__TEMPLATE)
        TFB_OF\ext=Upper(OneExt)
       
        Local CurBnkSize%=BankSize(TFB\ExtBnk)
        ResizeBank(TFB\ExtBnk,CurBnkSize+4)
        PokeInt(TFB\ExtBnk,CurBnkSize,Handle(TFB_OF))
End Function

Function TFileBank_Clear(TFB.TFileBank)
        Local TMP.TFileBank_OneFile
        For I=0 To BankSize(TFB\FilBnk)-1 Step 4
                TMP=Object.TFileBank_OneFile(PeekInt(TFB\FilBnk,I))
                TFileBank_OneFile_Delete(TMP)
        Next
        ResizeBank(TFB\FilBnk,0)
        TFB\ReadOk=0
        TFB\CurPos=0
End Function

Function TFileBank_ClearExts(TFB.TFileBank)
        Local TMP.TFileBank_OneFile
        For I=0 To BankSize(TFB\ExtBnk)-1 Step 4
                TMP=Object.TFileBank_OneFile(PeekInt(TFB\ExtBnk,I))
                TFileBank_OneFile_Delete(TMP)
        Next
        ResizeBank(TFB\ExtBnk,0)
End Function

Function TFileBank_Delete(TFB.TFileBank)
        TFileBank_Clear(TFB)
        TFileBank_ClearExts(TFB)
       
        FreeBank(TFB\FilBnk)
        FreeBank(TFB\ExtBnk)
       
        Delete TFB
End Function

Function TFileBank_Randomize(TFB.TFileBank)
        Local N%=Ceil(TFB\ReadOk/2.0)
        For i=1 To N
                Local a%=Rand(0,TFB\ReadOk-1)
                Local b%=(a+1+Rand(0,TFB\ReadOk-2)) Mod (TFB\ReadOk-1)
                Local sv%=PeekInt(TFB\FilBnk,a*4)
                PokeInt(TFB\FilBnk,a*4,PeekInt(TFB\FilBnk,b*4))
                PokeInt(TFB\FilBnk,b*4,sv)
        Next
End Function

Function TFileBank_GetRnd.TFileBank_OneFile(TFB.TFileBank)
        If TFB\ReadOk=0 Then Return Null
        If TFB\CurPos<1 Or TFB\CurPos>TFB\ReadOk
                TFileBank_Randomize(TFB)
                TFB\CurPos=1
        EndIf
        TFB\CurPos=TFB\CurPos+1
        Return Object.TFileBank_OneFile(PeekInt(TFB\FilBnk,(TFB\CurPos-2)*4))
End Function

Function TFileBank_GetRndFileName$(TFB.TFileBank)
        Local TFB_OF.TFileBank_OneFile=TFileBank_GetRnd(TFB)
        Return TFB_OF\fullname
End Function

Function TFileBank_Get.TFileBank_OneFile(TFB.TFileBank,id%)
        If TFB\ReadOk=0 Then Return Null
        If id<1 Or id>TFB\ReadOk Then Return Null
        Return Object.TFileBank_OneFile(PeekInt(TFB\FilBnk,(id-1)*4))
End Function

;===demo code
;SeedRnd(MilliSecs())
;FB.TFileBank=TFileBank_Create()
;TFileBank_AddExt(FB,"PNG")
;TFileBank_Add(FB,"textures")
;For i=1 To TFileBank_GetReadN(FB)
;        Print TFileBank_GetRndFileName(FB)
;Next
;TFileBank_Delete(FB)


impersonalis 16.08.2013 00:02

Ответ: Банк файлов
 
Исправленная версия одной из функций
Код:

Function TFileBank_Randomize(TFB.TFileBank)
        Local N%=Ceil(TFB\ReadOk/2.0)
        For i=1 To N
                Local a%=Rand(1,TFB\ReadOk)
                Local b%=((a+Rand(1,TFB\ReadOk-1)-1) Mod (TFB\ReadOk))
                a=a-1
                Local sv%=PeekInt(TFB\FilBnk,a*4)
                PokeInt(TFB\FilBnk,a*4,PeekInt(TFB\FilBnk,b*4))
                PokeInt(TFB\FilBnk,b*4,sv)
        Next
End Function



Часовой пояс GMT +4, время: 19:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot