Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Compressione File con IO.File.Compression
Forum - C# / VB.NET - Compressione File con IO.File.Compression

Avatar
Roldex (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/12/2013

Segnala al moderatore
Postato alle 21:44
Giovedì, 26/12/2013
Allora ragazzi... Visto e considerato che il metodo di compressione che stavo utilizzando prima era tutto errato ho cercato di crearne di un nuovo.....
A questo punto mi è venuto in mente di Creargli un piccolo programmino strutturato così:
http://i40.tinypic.com/jpdf6o.png
Open and Convert apri un file e lo converte in Array di Bytes in codesto modo:

Codice sorgente - presumibilmente VB.NET

  1. Dim OpenFileDialog1 As New OpenFileDialog
  2.         OpenFileDialog1.ShowDialog()
  3.         x = OpenFileDialog1.FileName
  4.         Dim fInfo As New FileInfo(x)
  5.         Dim numBytes As Long = fInfo.Length
  6.         Dim fStream As New FileStream(x, FileMode.Open, FileAccess.Read)
  7.         Dim br As New BinaryReader(fStream)
  8.         data = br.ReadBytes(CInt(numBytes))
  9.  
  10.         Label1.Text = Convert.ToString("Length: " & data.Length)
  11.         br.Close()
  12.         fStream.Close()



E quindi ottengo anche la lunghezza del File in Byte su un Label...
Poi con compress... Utilizzando il codice seguente....

Codice sorgente - presumibilmente VB.NET

  1. Public Shared Function Compress(ByVal data As Byte()) As Byte()
  2.         Dim i As Int32 = 0
  3.         Dim output As MemoryStream = New MemoryStream
  4.         Dim gzip As GZipStream = New GZipStream(output, CompressionMode.Compress, True)
  5.         Dim len As Int32 = data.Length
  6.         If len >= 8000 Then
  7.             While i <= len
  8.                 gzip.Write(data, 0, 4096)
  9.                 i += 4096
  10.             End While
  11.             gzip.Close()
  12.         Else
  13.             gzip.Write(data, 0, data.Length)
  14.             gzip.Close()
  15.         End If
  16.         Return output.ToArray
  17.     End Function



Ottengo comunque la lunghezza del File Compresso nel label...
E per decomprimere poi con:

Codice sorgente - presumibilmente VB.NET

  1. Public Shared Function Decompress(data As Byte()) As Byte()
  2.         Dim input As New MemoryStream()
  3.         input.Write(data, 0, data.Length)
  4.         input.Position = 0
  5.         Dim gzip As New GZipStream(input, CompressionMode.Decompress, True)
  6.         Dim output As New MemoryStream()
  7.         Dim buff As Byte() = New Byte(63) {}
  8.         Dim read As Integer = -1
  9.         read = gzip.Read(buff, 0, buff.Length)
  10.         While read > 0
  11.             output.Write(buff, 0, read)
  12.             read = gzip.Read(buff, 0, buff.Length)
  13.         End While
  14.         gzip.Close()
  15.         Return output.ToArray()
  16.     End Function



Però mi genera un errore alla riga: read = gzip.Read(buff, 0, buff.Length)
dicendomi:
Testo quotato

Eccezione non gestita di tipo 'System.IO.InvalidDataException' in System.dll

Ulteriori informazioni: Il numero chiave nell'intestazione GZip non è corretto. Verificare che il flusso passato sia di tipo GZip.


Perché? Decomprime troppo velocemente? Se si, come posso/potrei risolvere? Grazie in anticipo! D: :k:

Ultima modifica effettuata da Roldex il 30/12/2013 alle 21:46
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:08
Giovedì, 26/12/2013
Guarda il codice d'esempio in

http://msdn.microsoft.com/it-it/library/system.io.compress ...

e riscrivi il codice senza il vettore ma usando il metodo CopyTo (sia per la compressione sia per la decompressione)


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Roldex (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/12/2013

Segnala al moderatore
Postato alle 22:46
Giovedì, 26/12/2013
Ma CopyTo non è utilizzabile nel Framework 3.0???

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:47
Giovedì, 26/12/2013
E' utilizzabile dal 4.0 in poi ... ma non avevi detto con quale fmwk stai lavorando ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Roldex (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/12/2013

Segnala al moderatore
Postato alle 10:18
Venerdì, 27/12/2013
Perché però con il metodo descritto da Piero Tofy non è possibile decomprimere il File? :-|

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:43
Venerdì, 27/12/2013
Perché hai sbagliato a scrivere la parte della decompressione, in particolare devi leggere dallo Zip non devi scrivere ... e così via ... rivedi il codice.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Roldex (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/12/2013

Segnala al moderatore
Postato alle 21:45
Lunedì, 30/12/2013
Ho modificato completamente il Post principale con miglioramento NETTO del codice... Con un piccolissimo errore nella decompressione! Grazie a chi mi aiuterà a risolvere :D

PM Quote