![]() |
ZLib
Hi,
![]() gabs schonmal was bezüglich ZLib. Das komprimieren geht auch wunderbar. Leider kann ich die Dateien nicht entpacken da bei DecompressionStream.CopyFrom(InputStream, InputStream.Size); eine ungültige Stream Operation auftritt. Ich bekomm sie einfach nicht weg. Hätte jemand eine Idee? (noch was: steht der Huffmann Alog unter patent oder ist der komplett frei verwendbar?) viele Grüße Stephan |
Vor dem Zugriff auf den Stream die Position auf 0 setzen.
Delphi-Quellcode:
with DecompressionStream do
begin Position := 0; DecompressionStream.CopyFrom(InputStream, InputStream.Size); |
Re: ZLib
Moin,
bei mir tritt nun das gleiche Problem auf, sobald der Anwender eingeschränkte Rechte besitzt und ich weiß keine Lösung dafür. Der Code dazu ist ![]() Kennt jemand eine Lösung dafür? |
Re: ZLib
Ein einziges mal pushe ich nun, dann gehe ich davon aus, dass das Problem unlösbar ist. :stupid:
|
Re: ZLib
Zitat:
|
Re: ZLib
Hi
egal ob sich die Datei im User-Verzeichnis befindet (wo der User natürlich Schreibrechte hat) oder wo anders (die Datei wird in einen Ordner ins User-Verzeichnis entpackt), kommt immer obige Fehlermeldung. |
Re: ZLib
Das Verzeichnis ist egal, wenn er auf die Datei selbst keinen Zugriff hat.
Und der Fehler taucht auch beim DecompressionStream.CopyFrom auf, wie beim OP? Ich weiß nicht, ob für Marco Haffners Vorschlag eventuell Schreibrechte nötig sind, hat der Benutzer diese?s |
Re: ZLib
Zitat:
|
Re: ZLib
Wie sieht denn das dann mit den Dateirechten aus, müsste der User nicht Schreibrechte oder was auch immer haben, wenn die Datei in seinem Verzeichnis liegt?
|
Re: ZLib
Guten Abend. Ich muss nochmal pushen, es ist mir einfach zu wichtig. :stupid:
|
Re: ZLib
*ein lettes Mal pusht, danach gebe ich auf und baue das nicht ein* ;)
|
Re: ZLib
Also bei mir funktioniert es auch bei einem User ohne Adminrechten:
Delphi-Quellcode:
Die Fehlermeldung "Ungültige Stream Operation" kommt z.B. dann wenn du versuchst in den Decompressionstream zu schreiben. Also wenn du z.B. schreibst
procedure TForm1.Button1Click(Sender: TObject);
var SL: TStringList; begin SL := TStringList.Create; try SL.Add('xy.exe'); SL.Add('xy2.exe'); CompressFiles(SL, 'xy.zlib'); finally FreeAndNil(SL); end; end; procedure TForm1.Button2Click(Sender: TObject); begin DecompressFiles('xy.zlib', '.'); end;
Delphi-Quellcode:
statt
DecompressionStream.CopyFrom(InputStream, InputStream.Size);
Delphi-Quellcode:
outfile.CopyFrom(decompr,l);
|
Re: ZLib
Hallo, dankeschön, doch kann ich bei mir keinen Fehler entdecken.
Der Code ist lediglich dieser hier:
Delphi-Quellcode:
DokUndEinstDir ist der Pfad zu C:\Dokumente und Einstellungen\ ... \Anwendungsdaten\Programmname\. Versucht habe ich testweise auch, die Datei zuerst ins Userverzeichnis zu kopieren und dann zu entpacken, was jedoch auch dann nicht ging. Aber vielleicht liegt es wirklich nur am Code.
if OpenDialog2.Execute then
begin if Application.MessageBox('Do you want to overwrite the current settings of myAda?', 'Information', MB_YESNO) = mrYes then begin DecompressFiles(OpenDialog2.FileName, DokUndEinstDir); end; end; Frohe Weihnachten. |
Re: ZLib
Zitat:
|
Re: ZLib
Zitat:
Delphi-Quellcode:
DokUndEinstDir := IncludeTrailingPathDelimiter(GetSpecialFolder(Handle,
CSIDL_APPDATA)) + 'myAda\data\'; |
Re: ZLib
Für mich schaut es so aus, als ob er ein Problem beim Ermitteln der richtigen Datenlänge hat und dadurch versucht mehr zu lesen, als er dürfte. Aber für eine korrigierte Version fehlt mir die Zeit :-(
Aber wenn alle Dateien inklusive der Anwendung im selben Verzeichnis liegen, dann scheint es zu klappen... |
Re: ZLib
Zitat:
Zitat:
|
Re: ZLib
Hier mal der ganze Code von mir, vielleicht entdeckt ihr einen Fehler.
Code 1:1 vom SDC übernommen:
Delphi-Quellcode:
Mein Aufruf:
procedure DecompressFiles(const Filename, DestDirectory: string);
var dest,s : String; decompr : TDecompressionStream; infile, outfile : TFilestream; i,l,c : Integer; begin // IncludeTrailingPathDelimiter (D6/D7 only) dest := IncludeTrailingPathDelimiter(DestDirectory); infile := TFileStream.Create(Filename,fmOpenRead); try { number of files } infile.Read(c,SizeOf(c)); for i := 1 to c do begin { read filename } infile.Read(l,SizeOf(l)); SetLength(s,l); infile.Read(s[1],l); { read filesize } infile.Read(l,SizeOf(l)); { decompress the files and store it } s := dest+s; //include the path outfile := TFileStream.Create(s,fmCreate); decompr := TDecompressionStream.Create(infile); try outfile.CopyFrom(decompr,l); finally outfile.Free; decompr.Free; end; end; finally infile.Free; end; end;
Delphi-Quellcode:
Der Aufruf ist eigentlich trivial, darum kann dort der Fehler nicht liegen.
if OpenDialog2.Execute then
begin if Application.MessageBox('Do you want to overwrite the current settings?', 'Information', MB_YESNO) = mrYes then begin DecompressFiles(OpenDialog2.FileName, DokUndEinstDir); end; end; Und erstellt wurde die zu dekomprimierende Datei über den Code ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz