Seite 2 von 2

Verfasst: 20.02.2005 18:23
von traumatic
MVXA hat geschrieben:Wenn ich die RFile in kombination mit FileCreate benutze, kann ich in meine geöffnete Datei nichts schreiben.
Klingt nach Locking... kannst Du mal etwas genauer werden?
Ein Beispiel mit Instruktionen posten oder so?

Verfasst: 20.02.2005 18:34
von MVXA
wird schwer, weil ich den Source schon auf API umgestellt habe. Ich kann dir aber mal den jetzigen Source geben. Musste halt nur die API Befehle gegen die PB Befehle austauschen:

Code: Alles auswählen

Procedure.s WritePack(strDatei.s, lngPaketSize.l, strTempFolder.s)
    DefType.l PakArchiv, lngI, TimeLine, FileBuffer
    DefType.s strArchiv, strTemp
    DefType.API_FileHandle Orginal
    
    If Right(strTempFolder, 1) <> "\": strTempFolder + "\": EndIf
    strArchiv = strTempFolder + GetFilePart(Left(strDatei, FindString(strDatei, ".", 1) - 1)) + ".tmp"
    If FileSize(strArchiv) => 0
        API_FileReadEx(@Orginal, strDatei, FileSize(strDatei))
        PakArchiv     = RFile_Create(strArchiv, lngPaketSize) 
        FileBuffer    = AllocateMemory(lngPaketSize+1)
        
        DeleteFile(strArchiv)
        While API_EOF(Orginal) = #False
            RtlFillMemory_(FileBuffer, lngPaketSize, 0)
            API_ReadData(@Orginal, FileBuffer, lngPaketSize)
            RFile_Put(PakArchiv, lngI, FileBuffer)
            
            lngI+1: If (lngI % 1000) = 0: Delay(1): EndIf
        Wend
        
        RFile_Close(PakArchiv)
        API_CloseFile(@Orginal)
        ProcedureReturn strArchiv        
    EndIf
EndProcedure

Procedure ReadPack(strSource.s, strDest.s, strTempFolder.s)
    DefType.l lngI, PakArchiv, FileBuffer, TimeLine
    DefType.s strArchiv
    DefType.API_FileHandle Orginal 
    
    If Right(strTempFolder, 1) <> "\": strTempFolder + "\": EndIf
    strSource = strTempFolder + strSource 
    strArchiv = strTempFolder
    strArchiv + GetFilePart(Left(strSource, FindString(strSource, ".", 1) - 1)) + ".tmp" 
    strDest   = strTempFolder + strDest 
    
    PakArchiv   = RFile_Open(strArchiv)
    API_FileCreate(@Orginal, strDest)
    FileBuffer  = AllocateMemory(RFile_RecordLength(PakArchiv)+1)

    For lngI = 0 To RFile_RecCount(PakArchiv)
        RFile_Get(PakArchiv, lngI, FileBuffer)
        API_WriteData(@Orginal, FileBuffer, RFile_RecordLength(PakArchiv))
        If (lngI % 10000) = 0: Delay(1): EndIf
    Next
    
    API_CloseFile(@Orginal)
    RFile_Close(PakArchiv)
EndProcedure

Debug WritePack("C:\Test.exe", 5*1024, "C:\")
;ThreadPriority(CreateThread(@WritePack(), 0), 16)
Debug "---"
ReadPack("Test.exe", "Test2.exe", "C:\")
das Programm läuft wirklich schnell. Verarbeitet ne 700 MB Datei in ca. 2 Minuten. Schneller nicht weil meine HDD nicht mehr macht 8).