RAR Datei entpacken

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

war doch nur ein scherz.

Übrigens, ich glaub ich hab mal sowas in der art im CodeArchiv gesehen.
v6.00
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

@Thomas Obermeier
Übrigens, ich glaub ich hab mal sowas in der art im CodeArchiv gesehen.
Glauben heißt nichts wissen - und in diesem Fall dann einfach "Finger weg von der Tastatur" :evil:


Gruß FGK
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

wow, super, vielen dank!
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

Code: Alles auswählen

;PB_unRAR - Paul Leischow, Sept.6, 2002
;RAR Archive extractor that uses the free UNRAR.DLL
;


#RAR_OM_LIST=0
#RAR_OM_EXTRACT=1
#RAR_SKIP=0
#RAR_TEST=1
#RAR_EXTRACT=2
#RAR_VOL_ASK=0
#RAR_VOL_NOTIFY=1
#RAR_DLL_VERSION=3


Structure RARHeaderData
  ArcName.b[260]
  FileName.b[260]
  Flags.l
  PackSize.l
  UnpSize.l
  HostOS.l
  FileCRC.l
  FileTime.l
  UnpVer.l
  Method.l
  FileAttr.l
  *CmtBuf.s
  CmtBufSize.l
  CmtSize.l
  CmtState.l
EndStructure
rarheader.RARHeaderData

Structure RAROpenArchiveData
  *ArcName.s
  OpenMode.l
  OpenResult.l
  *CmtBuf.s
  CmtBufSize.l
  CmtSize.l
  CmtState.l
EndStructure
raropen.RAROpenArchiveData



OpenLibrary(0,"unrar.dll") 
  *RAROpenArchive=IsFunction(0,"RAROpenArchive") 
  *RARCloseArchive=IsFunction(0,"RARCloseArchive") 
  *RARReadHeader=IsFunction(0,"RARReadHeader")  
  *RARProcessFile=IsFunction(0,"RARProcessFile") 
  *RARGetDllVersion=IsFunction(0,"RARGetDllVersion")


      raropen\ArcName="test.rar"
      raropen\OpenMode=#RAR_OM_EXTRACT
      hRAR=CallFunctionFast(*RAROpenArchive,@raropen)
      
      If raropen\OpenResult
        MessageRequester("Error","Could Not Open RAR File",#MB_ICONERROR)
        Else        
        Repeat 
          stat=CallFunctionFast(*RARReadHeader,hRAR,@rarheader)
          If stat=0
            filelist.s+PeekS(@rarheader\FileName[0])+Chr(10)
            res=CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,"c:",@rarheader\FileName[0])
          EndIf 
        Until stat<>0 
        MessageRequester("Files Extracted",filelist,#MB_ICONINFORMATION)
      EndIf

      CallFunctionFast(*RARCloseArchive,hRAR)
 
  CloseLibrary(0)

  
  
Damit funzt es echt super! Leider hab ich da noch ein Problem.
Beim Extrahieren weiss ich nicht wie ich den Pfad angeben soll... :roll:
DestPath
This parameter should point to a zero terminated string containing the
destination directory to which to extract files to. If DestPath is equal
to NULL it means extract to the current directory. This parameter has
meaning only if DestName is NULL.

DestName
This parameter should point to a string containing the full path and name
of the file to be extracted or NULL as default. If DestName is defined
(not NULL) it overrides the original file name saved in the archive and
DestPath setting.

Both DestPath and DestName must be in OEM encoding. If necessary,
use CharToOem to convert text to OEM before passing to this function.

Code: Alles auswählen

CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,"c:",@rarheader\FileName[0])
So funktionierst nicht... Wie muss ich den Pfad angeben... OEM sagt mir nichts. Hiermit vllt. Text$ = Chr(ASCII-Wert) :?
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Vielleicht nur ein Schreibfehler aber wenn du das Verzeichnis C meinst musst du C:\ schreiben oder?
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

Scarabol hat geschrieben:Vielleicht nur ein Schreibfehler aber wenn du das Verzeichnis C meinst musst du C:\ schreiben oder?
hat auch nicht geholfen, ich denke man darf nicht einfach den pfad in "" schreiben:

Code: Alles auswählen

Both DestPath and DestName must be in OEM encoding. If necessary,
use CharToOem to convert text to OEM before passing to this function.
hm... :|
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Hab da mal was gemacht, da ich es eh für mein aktuelles project brauche.
Der Code basiert auf dem hier im Board. Allerdings habe ich noch einen
CallBack hinzugefügt. Dieser lässt jedoch zu wünschen übrig, da er meiner
meinung nach vielzu selten die CallBackProc anspringt und das Multitasking
bzw. prog durch die zu wenigen Events() stark blockiert wird. Aber ansonsten
klappt die routine soweit ganz gut und auch ein eigener Pfad kann angegeben
werden. :wink:

BTW:
Um den CallBack zu verfolgen, am besten im DebugModus starten und
unbedingt eine grosse (5MB+ oder so) Datei benutzen, da der CallBack
der dll wirklich sehr unregelmäßig ist und u.U. erst nach ein paar MB
den Callback wieder ausführt.

Code: Alles auswählen

Global len.l

Structure RAROpenArchiveData 
    ArcName.s 
    OpenMode.l 
    OpenResult.l 
    CmtBuf.s 
    CmtBufSize.l 
    CmtSize.l 
    CmtState.l 
EndStructure 

Structure RARHeaderData 
    ; ArcName As String * 260 
    ; FileName As String * 260 
    ArcName.b[260] 
    Filename.b[260] 
    flags.l 
    PckSize.l 
    UnpSize.l
    HostOS.l 
    FileCRC.l 
    FileTime.l 
    UnpVer.l 
    Method.l 
    FileAttr.l 
    CmtBuf.s 
    CmtBufSize.l 
    CmtSize.l 
    CmtState.l 
EndStructure 

Procedure.l CallBackRAR(msg.l,UserData.l,p1.l,p2.l)

;Debug msg
;Debug UserData
;Debug p1
len+p2
Debug "Current UnpackSize = " +Str(len)

EndProcedure

Procedure.l UnRarFile(RarArchive$,PackFile$,DestPath$)

x.l=0
lHandle.l 
iStatus.l 
uRAR.RAROpenArchiveData 
uHeader.RARHeaderData 
sStat.s 
Ret.l 
uRAR\ArcName = RarArchive$
uRAR\CmtBuf = Space(16384) 
uRAR\CmtBufSize = 16384 
uRAR\OpenMode = 1 ; 1 = Entpacken / 0 = Liste

If Right(DestPath$,1)<>"\" : DestPath$+"\" : EndIf

If OpenLibrary(0, "c:\unrar.dll") ; <---- Pfad nicht vergessen anzugeben!!!

  *RAROpenArchive.l = GetFunction(0, "RAROpenArchive") 
  *RARCloseArchive.l = GetFunction(0, "RARCloseArchive") 
  *RARReadHeader.l = GetFunction(0, "RARReadHeader") 
  *RARProcessFile.l = GetFunction(0, "RARProcessFile") 
  *RARSetChangeVolProc.l = GetFunction(0, "RARSetChangeVolProc") 
  *RARSetPassword.l = GetFunction(0, "RARSetPassword") 
  *RARSetCallback.l = GetFunction(0, "RARSetCallback")

  lHandle = CallFunctionFast(*RAROpenArchive,@uRAR) 
  CallFunctionFast(*RARSetCallback,lHandle,@CallBackRAR(),0)

  If uRAR\OpenResult = 0
    Repeat
      iStatus = CallFunctionFast(*RARReadHeader,lHandle, @uHeader) 
      If iStatus=0
        sStat = PeekS(@uHeader\Filename)
        If LCase(sStat) = LCase(PackFile$)
          Ret = CallFunctionFast(*RARProcessFile,lHandle, 2, "", DestPath$+GetFilePart(PackFile$))
          x=1
        Else
          Ret = CallFunctionFast(*RARProcessFile,lHandle, 0, "", "") 
        EndIf
      EndIf
    Until iStatus<>0
    CallFunctionFast(*RARCloseArchive, lHandle) 
  EndIf
  CloseLibrary(0)

EndIf

ProcedureReturn x

EndProcedure

UnRarFile("c:\zzz.rar","test4","c:\aaa\")
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Beitrag von Marvin »

Müsste man den Pfad nicht einfach mit "@" angeben? :?

Code: Alles auswählen

res=CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,@"C:",@rarheader\FileName[0])
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

super, vielen dank, werde es ausprobieren!
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

funktioniert noch immer nicht :(

@al90:statt getfunction habe ich isfunction verwendet.... ich denke das machtn ichts... oder?

ich habe deinen code ausgeführt doch es hat sich nichts entpackt.

@Marvin: es wird was entpackt, aber meistens dort wo das programm ausgeführt wird. d.h. er erkennt keinen destpath$ parameter :(
vllt. stimmt was mit meiner unrar.dll nicht o.O
Antworten