Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    [VB.net] Da stream a file

    Ciao! come faccio a scrivere un file da una memorystream?

    Per esempio per le immagini c'è l'opzione apposta "fromstream"

    codice:
    PictureBox1.Image = Image.FromStream(memorystream)
    Ma per fare la stessa cosa su un file con un percorso specifico come faccio??

    Ho provato così ma mi salva, giustamente, un solo byte:

    codice:
    File.WriteAllText(percorso.Text + "\mioexe.exe", memorystream.ReadByte)
    Mi servirebbe un "readallbyte" che però non esiste

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [VB.net] Da stream a file

    Originariamente inviato da drhouseitalia
    Mi servirebbe un "readallbyte" che però non esiste
    Ma c'e' la

    Read

    http://msdn2.microsoft.com/it-it/lib...ad(VS.80).aspx
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    grazie della risposta!

    Non riesco però a usarlo "read"... come devo fare perché legga tutto lo stream??

  4. #4
    codice:
    'Copia il contenuto di InStream in OutStream.
    'Importante: la gestione degli errori è totalmente a carico del chiamante.
    'Gli stream restano aperti al termine della funzione
    Public Sub StreamToStream(ByVal InStream As Stream, ByVal OutStream As Stream, Optional ByVal BufSize As Integer = 4096)
        Dim readBytes As Integer
        If BufSize < 1 Then
            Throw New ArgumentOutOfRangeException("BufSize", BufSize, "The buffer size must be greater than zero.")
        End If
        Dim buffer(BufSize) As Byte
        While True
            readBytes = InStream.Read(buffer, 0, BufSize)
            If readBytes = 0 Then Exit While
            OutStream.Write(buffer, 0, readBytes)
        End While
    End Sub
    Esempio di utilizzo:
    codice:
    Dim InStream As FileStream, OutStream As FileStream
    Try
        InStream = New FileStream("d:\FileDiInput.bmp", FileMode.Open, FileAccess.Read)
        OutStream = New FileStream("d:\FileDiOutput.bmp", FileMode.OpenOrCreate, FileAccess.Write)
        StreamToStream(InStream, OutStream)
    Catch ex As Exception
        'TODO: aggiungere la gestione degli errori
    Finally
        If Not (InStream Is Nothing) Then
            InStream.Close()
        End If
        If Not (OutStream Is Nothing) Then
            OutStream.Close()
        End If
    End Try
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    grazie mille!! sono comunque riuscito anche così:

    codice:
    Dim Bytes(s2.Length - 1) As Byte
    s2.Read(Bytes, 0, Bytes.Length)
    IO.File.WriteAllBytes(percorso.Text, Bytes)
    Ho però una perdita di byte, ad esempio una canzone di 4,71 mega diventa di 4,7....
    Come mai??? non riesco a capire :master: :master:

  6. #6
    Non so bene dove si "perdano" i bytes, ma il metodo che hai usato va assolutamente evitato, dal momento che alloca un buffer potenzialmente molto grande inutilmente (se il file da scrivere fosse di 100 MB allocheresti inutilmente 100 MB di memoria). Usa la funzione che ho scritto nel mio post precedente.
    ---EDIT---
    La funzione che ho postato prima ha un piccolo errore; invece di
    codice:
        Dim buffer(BufSize) As Byte
    inserisci
    codice:
        Dim buffer(BufSize - 1) As Byte
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    perdona la mia incapacità ma non riesco a far funzionare il tuo codice....

    Cosa devo mettere qui?

    codice:
     
    InStream = New FileStream("d:\FileDiInput.bmp", FileMode.Open, FileAccess.Read)
    il file è sulla memorystream non in un percorso..

  8. #8
    L'esempio di MItaly è ottimo, utilizza solo 4k di memoria e copia da stream caricato da file di input a stream che carica file di output. te devi ovviamente saltare solo il primo passo, quello in cui carichi il file di input perchè lo stream di input già ce l'hai

    codice:
            Dim buffer(4096) As Byte
            Dim OutputStream As FileStream = New FileStream("tuofileoutput.txt", FileMode.Create)
            Dim BytesRead As Integer
            While True
                BytesRead = TuoMemoryStream.Read(buffer, 0, buffer.Length)
                If BytesRead = 0 Then Exit While
                OutputStream.Write(buffer, 0, BytesRead)
            End While
            OutputStream.Close()
            TuoMemoryStream.Close()

  9. #9
    Veramente l'idea era di usare la sub come "scatola nera" che fa il lavoro da sé, senza ricopiarne il codice da altre parti, per cui:
    codice:
    'Copia il contenuto di InStream in OutStream.
    'Importante: la gestione degli errori è totalmente a carico del chiamante.
    'Gli stream restano aperti al termine della funzione
    Public Sub StreamToStream(ByVal InStream As Stream, ByVal OutStream As Stream, Optional ByVal BufSize As Integer = 4096)
        Dim readBytes As Integer
        If BufSize < 1 Then
            Throw New ArgumentOutOfRangeException("BufSize", BufSize, "The buffer size must be greater than zero.")
        End If
        Dim buffer(BufSize - 1) As Byte
        While True
            readBytes = InStream.Read(buffer, 0, BufSize)
            If readBytes = 0 Then Exit While
            OutStream.Write(buffer, 0, readBytes)
        End While
    End Sub
    
    '...
    
    Dim OutStream As FileStream
    Try
        OutStream = New FileStream(percorso.Text, FileMode.OpenOrCreate, FileAccess.Write)
        StreamToStream(s2, OutStream)
    Catch ex As Exception
        'TODO: aggiungere la gestione degli errori
    Finally
        If Not (s2 Is Nothing) Then
            s2.Close()
        End If
        If Not (OutStream Is Nothing) Then
            OutStream.Close()
        End If
    End Try
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Mi dice che la variabile outstream è utilizzata prima che le sia stato assegnato un valore!
    Ho provato a compilarlo comunque e il file esce di 0 byte...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.