[VB 2005] unire due file

lunedì 06 luglio 2009 - 16.17

reru Profilo | Newbie

Salve,
ho una minuscola app per stampare etichette, testo+img, e funzionicchia...
A questo punto, al posto di due file generati (il testo dell'etichetta e l'img) mi piacerebbe poter unire il tutto in un unico file(questi file potrebbero essere inviati ad altri utenti, così eviterei di inviare magari l'img e non il testo o viceversa), è possibile ?
Come, avete un esempio ?
Ovviamente il file di uscita (prova.xxx) mi dovrà permettere di rileggere i dati del file di testo originario

PS
Altri suggerimenti ?

Grazie mille
R.Zanni

reru Profilo | Newbie

...nessuno ha qualche suggerimento/esempio ?

Grazie

aiedail92 Profilo | Expert

Ciao

Il file ottenuto dall'unione dei due, poi lo andresti a leggere con la tua applicazione, giusto?

Luca

reru Profilo | Newbie

ciao e grazie per l'interessamento,
si, rileggo e mostro/modifico i dati per poi ricreare il file (portabile)

grazie

PS
in effetti ho parzialmente "tamponato" creando "al volo" uno zip dei due

aiedail92 Profilo | Expert

Allora potresti fare una cosa molto banale:

Crei un file strutturato in questo modo:

8 Byte (un long) contenenti la dimensione del primo file (il jpg) Tutto il primo file (jpg) Tutto il secondo file

In questo modo, sapendo la dimensione di un file puoi leggere tutto il jpg ed estrarlo su un file separato, mentre quello che resta del file deve necessariamente costituire il secondo file.

Eccoti un esempio per creare il file dai due e per risepararli:

Private Sub TuoButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles TuoButton.Click JoinFiles("C:\spewer.exe", "C:\reflector.exe", "C:\joint") SplitFiles("C:\joint", "C:\a.exe", "C:\b.exe") End Sub Sub JoinFiles(ByVal jpg As String, ByVal txt As String, ByVal out As String) Using outwriter As New FileStream(out, FileMode.Create) Dim len As Long = New FileInfo(jpg).Length outwriter.Write(BitConverter.GetBytes(len), 0, 8) Dim buffer(10240) As Byte Dim read As Integer Using jpgread As New FileStream(jpg, FileMode.Open) Do read = jpgread.Read(buffer, 0, 10240) outwriter.Write(buffer, 0, read) Loop While read > 0 End Using Using txtread As New FileStream(txt, FileMode.Open) Do read = txtread.Read(buffer, 0, 10240) outwriter.Write(buffer, 0, read) Loop While read > 0 End Using End Using End Sub Sub SplitFiles(ByVal infile As String, ByVal jpg As String, ByVal txt As String) Using inreader As New FileStream(infile, FileMode.Open) Dim buffer(10240) As Byte inreader.Read(buffer, 0, 8) Dim len As Long = BitConverter.ToInt64(buffer, 0) Dim read As Integer Using jpgwriter As New FileStream(jpg, FileMode.Create) Dim left As Long = len While left > 0 read = inreader.Read(buffer, 0, Math.Min(left, 10240)) jpgwriter.Write(buffer, 0, read) left -= read End While End Using Using txtwriter As New FileStream(txt, FileMode.Create) Do read = inreader.Read(buffer, 0, 10240) txtwriter.Write(buffer, 0, read) Loop While read > 0 End Using End Using End Sub

Luca

reru Profilo | Newbie

cia,
grazie mille per la risposta, sei stato veramente gentile.
Domattina proverò subito.

grazie nuovamente

reru Profilo | Newbie

ciao,
un'ultima domanda, poi prometto di non rompere più .
Per evitare di passare anche il nome dei files da splittare, è possibile in fase di unione salvare anche i nomi dei files all'interno (tipo intestazione di file) così da recuperali in automatico ?
E se si come potrei fare ?

grazie infinite per l'aiuto

saluti

aiedail92 Profilo | Expert

Rompi pure quanto vuoi

Venendo al dunque, il codice non differisce di molto da quello precedente, basta aggiungere un paio di istruzioni per scrivere i nomi dei file:

Sub JoinFiles(ByVal jpg As String, ByVal txt As String, ByVal out As String) ' Crea il file che sarà l'unione dei due Using outstream As New FileStream(out, FileMode.Create) ' Ottiene le informazioni sui file jpg e txt Dim jpg_info As New FileInfo(jpg) Dim txt_info As New FileInfo(txt) ' Scrive la lunghezza del nome del jpg outstream.Write(BitConverter.GetBytes(jpg_info.Name.Length), 0, 4) ' Scrive la lunghezza del file jpg outstream.Write(BitConverter.GetBytes(jpg_info.Length), 0, 8) ' Scrive la lunghezza del nome del txt outstream.Write(BitConverter.GetBytes(txt_info.Name.Length), 0, 4) ' Scrive la lunghezza del file txt outstream.Write(BitConverter.GetBytes(txt_info.Length), 0, 8) ' Scrive il nome del file jpg outstream.Write(Encoding.UTF8.GetBytes(jpg_info.Name), 0, jpg_info.Name.Length) Dim buffer(10240) As Byte Dim read As Integer ' Scrive tutto il file jpg Using jpgread As New FileStream(jpg, FileMode.Open) Do read = jpgread.Read(buffer, 0, 10240) outstream.Write(buffer, 0, read) Loop While read > 0 End Using ' Scrive il nome del file txt outstream.Write(Encoding.UTF8.GetBytes(txt_info.Name), 0, txt_info.Name.Length) ' Scrive tutto il file txt Using txtread As New FileStream(txt, FileMode.Open) Do read = txtread.Read(buffer, 0, 10240) outstream.Write(buffer, 0, read) Loop While read > 0 End Using End Using End Sub Sub SplitFiles(ByVal infile As String) ' Apre il file da dividere per la lettura Using inreader As New FileStream(infile, FileMode.Open) Dim jpg_len, jpg_size, txt_len, txt_size As Integer Dim buffer(10240) As Byte Dim read As Integer ' Legge la lunghezza del nome del jpg, la dimensione del jpg, ' la lunghezza del nome del txt e la dimensione del txt read = inreader.Read(buffer, 0, 24) jpg_len = BitConverter.ToInt32(buffer, 0) jpg_size = BitConverter.ToInt64(buffer, 4) txt_len = BitConverter.ToInt32(buffer, 12) txt_size = BitConverter.ToUInt64(buffer, 16) ' Legge il nome del file jpg inreader.Read(buffer, 0, jpg_len) Dim jpg As String = Encoding.UTF8.GetString(buffer, 0, jpg_len) ' Estrae il file jpg Using jpgwriter As New FileStream(jpg, FileMode.Create) Dim left As Long = jpg_size While Left > 0 read = inreader.Read(buffer, 0, Math.Min(Left, 10240)) jpgwriter.Write(buffer, 0, read) left -= read End While End Using ' Legge il nome del file txt inreader.Read(buffer, 0, txt_len) Dim txt As String = Encoding.UTF8.GetString(buffer, 0, txt_len) ' Estrae il file txt Using txtwriter As New FileStream(txt, FileMode.Create) Dim left As Long = txt_size While left > 0 read = inreader.Read(buffer, 0, 10240) txtwriter.Write(buffer, 0, read) left -= read End While End Using End Using End Sub

Luca

reru Profilo | Newbie

...sono commosso dalla tua disponibilità

grazie mille veramente, domattina riproverò il tutto

Grazie buona serata

PS
Solo per info,tanto sono sicuro di non esserne in grado,...volessi "costruirmi" un file "proprietario" dove salvo immagini e testo, modificarlo a piacimento etc. dove posso reperire della documentazione ?

aiedail92 Profilo | Expert

Per costruire un file proprietario tuo, basta usare la fantasia , un po' come ho fatto io in questo esempio.

Se invece vuoi usare un formato proprietario esistente (tipo jpeg, png, tiff ecc...) devi cercare informazioni su quel formato specifico. Sono abbastanza complessi, ma la wikipedia inglese fornisce un buon punto di partenza:

http://en.wikipedia.org/wiki/Portable_Network_Graphics
http://en.wikipedia.org/wiki/Jpeg

Luca

reru Profilo | Newbie

grazie mille,proverò...

saluti e buon week-end,..e se ci devi ancora andare..buone ferie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5