AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)
Thema durchsuchen
Ansicht
Themen-Optionen

ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

Ein Thema von Jim Carrey · begonnen am 10. Okt 2016 · letzter Beitrag vom 12. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Jim Carrey
(Gast)

n/a Beiträge
 
#1

ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 10. Okt 2016, 23:26
Ich benutze seit Neuestem privat ZIP-Forge zum Zippen von Dateien in meinem Projekt.

Da das normale Zippen zulange dauerte habe ich auf das Zippen direkt im Speicher über einen TMemoryStream umgestellt.
Jetzt ist mir aufgefallen, dass normal geöffnete Dateien ohne besondere Schutz-Rechte nicht in den Speicher geschrieben werden können.

Genauer gesagt ist Datei Projekt.exe in Verzeichnis ABC offen und ich zippe mit Projekt.exe das Verzeichnis ABC.
Projekt.exe kann jetzt nicht gezippt werden.

Gibt es hier einen Schalter den ich einstellen kann, dass die Datei nur im Lese-Modus geöffnet wird und nicht auch im Schreibmodus?

So sieht das Originalbeispiel aus und so verwende ich es auch
Delphi-Quellcode:
var
  Archiver: TZipForge;
  ms: TMemoryStream;
begin
  // create ZipForge object
  Archiver := TZipForge.Create(nil);
  // create memory stream
  ms := TMemoryStream.Create;
  try
    // create a new archive in the memory stream (specify False to open an existing archive)
    Archiver.OpenArchive(ms, True);
    // save a file into the archive
    Archiver.AddFiles('c:\file.txt');
    // close archive
    Archiver.CloseArchive();
  except
     on E: Exception do
     begin
       Writeln('Error: ' + E.Message);
     end;
  end;
  ms.Free;
  Archiver.Free;
end.
Ohne Memorystream ist alles OK und auch normal geöffnete Dateien können gezippt werden.

Geändert von Jim Carrey (10. Okt 2016 um 23:34 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 05:29
Hallo,
hast die Version nicht mit den Quellen?
Heiko
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 06:24
Kann das Teil nicht zufällig auch ein AddStream? Dann könntest Du das ja über den Weg selbst erledigen... auch ohne Sourcen...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 07:56
Zitat:
Kann das Teil nicht zufällig auch ein AddStream?
Laut Featurelist ja:
Zitat:
Save/Load zipped data from stream
Ich habe mir mal die PE angesehen. Dort scheint es die Methode auch zu geben
Miniaturansicht angehängter Grafiken
zipforge_addfromstream.jpg  
Markus Kinzler

Geändert von mkinzler (11. Okt 2016 um 08:00 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#5

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 10:01
Ich habe die Sourcen leider auch nicht.
Aber wenn man das Archiv mit einem Stream "öffnet" ZipForge1.OpenArchive(aMemoryStream, True); ... und dann Dateien "hinzufügt" ZipForge1.AddFiles(); ... ackert der intern dann nicht auch AddToStream ab?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 10:12
ackert der intern dann nicht auch AddToStream ab?
Vermutlich ja, aber da kannst DU selber den Stream öffnen und somit auch die Sharingrechte bestimmen.
$2B or not $2B
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#7

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 10:17
Ich habe das gerade mal so versucht
Delphi-Quellcode:
ZipForge1.OpenArchive(fmCreate);

// Statt ZipForge1.AddFiles(aFileName); nun ...

// for ... alle meine Daten
aFileStream := TFileStream.Create(aFileName, fmOpenRead); // fmOpenRead statt fmOpenWrite
ZipForge1.AddFromStream(aFileName, aFileStream);
aFileStream.Free;
// ende for

ZipForge1.CloseArchive;
Leider ist das Archiv dann leer. Ich habe bestimmt einen sau-blöden Fehler gemacht und sehe ihn nicht.
Das Archiv war nur leer, weil ich am Ende der For-Schleife noch ein aMemoryStream.SaveToFile() vom alten MemoryStream stehen hatte.


Edit: ich sehe gerade ZipForge1.AddFromStream() hat leider einen Bug und ist unbrauchbar.
Die Option ZipForge1.Options.StorePath := spRelativePath; wird bei AddFromStream komplett ignoriert.
Außer aber man entfernt durch String-Replace das BaseDir aus aFileName, dann ist es OK.

Geändert von Jim Carrey (11. Okt 2016 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#8

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 11:16
Das funktioniert jetzt soweit sehr gut.
Auch wenn es umständlich ist.

Delphi-Quellcode:
aMemoryStream := TMemoryStream.Create;
ZipForge1.OpenArchive(aMemoryStream, True);

aFileStream := TFileStream.Create(aCurrItem.sSourceDirItem, fmOpenRead);
try
 ZipForge1.AddFromStream(StringReplace(aFileName, ZipForge1.BaseDir, ''), aFileStream);
finally
 aFileStream.Free;
end;

ZipForge1.CloseArchive;
aMemoryStream.SaveToFile(ZipForge1.FileName);
Einzige unschöne Nebenwirkung ist, dass wenn man große Dateien zippen möchte man die Meldung bekommt "Zu wenig Arbeitsspeicher".
Aber das ist wohl der bittere Nebengeschmack denke ich. Ab circa 500MB im Taskmanager bekomme zumindest ich die Meldung.

Dann werde ich wohl jetzt eine Art Kreuzung einbauen die bei Verzeichnissen, sagen wir mal, bis zu Größe-X mit dem FileStream zippt und sonst normal.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 13:21
"Zu wenig Arbeitsspeicher" [....] Ab circa 500MB im Taskmanager bekomme zumindest ich die Meldung.
Nur mal so interessenhalber: Tritt der Fehler auch auf wenn du als 64 Bit kompilierst?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#10

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 14:11
Daran habe ich noch nicht gedacht. Aber nein, da passiert es nicht.

Ich habe eben den Compiler-Schalter {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} gefunden. Mit dem klappt auch das Komprimieren von 500MB+ großen Dateien.
Ohne ihn nicht.

Kann dieser Schalter irgendwelche Nebenwirkungen hervorufen?

Geändert von Jim Carrey (11. Okt 2016 um 15:21 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz