2011-11-23 16 views
8

Sto facendo un'applicazione in C#. In quell'applicazione ho un array di byte e voglio scrivere i dati dell'array di byte in una posizione particolare.Come scrivere i dati in una particolare posizione in C#?

Qui ho usato la seguente logica.

using(StreamWriter writer=new StreamWriter(@"D:\"+ FileName + ".txt",true)) 
{ 
    writer.WriteLine(Encoding.ASCII.GetString(Data),IndexInFile,Data.Length); 
} 

Ma ogni volta che scrivo dati in un file, inizia a scrivere dall'inizio.

La mia condizione è che supponiamo all'inizio di avere un file vuoto e voglio iniziare a scrivere in file dalla posizione 10000. Please help me. Thanks in anticipo.

+0

Ho ricevuto l'errore come 'System.IO.IOException: Impossibile cercare indietro per sovrascrivere i dati che esistevano in precedenza in un file aperto in modalità Append. a System.IO.FileStream.Seek (offset Int64, origine SeekOrigin) ' – Dany

risposta

10

Non provare mai a scrivere dati binari come stringhe, come fai tu. Non funzionerà correttamente. Scrivi dati binari come dati binari. È possibile utilizzare Stream invece di StreamWriter.

using (Stream stream = new FileStream(fileName, FileMode.OpenOrCreate)) 
{ 
    stream.Seek(1000, SeekOrigin.Begin); 
    stream.Write(Data, 0, Data.Length); 
} 
+0

l'ho usato ma sto ricevendo un errore come System.IO.IOException: Unable cerca indietro per sovrascrivere i dati che esistevano in precedenza in un file aperto in modalità Append. in System.IO.FileStream.Seek (offset Int64, origine SeekOrigin) – Dany

+2

Quindi non utilizzare 'FileMode.Append'. – svick

+0

Ma voglio aggiungere i dati. Allora cosa farò? – Dany

1

Forse un po 'hacky, ma è possibile accedere alla proprietà BaseStream dello StreamWriter e utilizzare Seek(long offset, SeekOrigin origin) su di esso. (Ma attenzione, come non ogni flusso può utilizzare Seek.)

3

È possibile impostare la posizione all'interno del flusso in questo modo:

writer.BaseStream.Seek(1000, SeekOrigin.Begin); 

Aggiungi questo prima il codice WriteLine.

Nota che non ho incluso alcun codice per verificare che ci siano almeno 1000 caratteri nel file per iniziare.

+0

Penso che 'Seek()' funzioni bene anche se il file non è abbastanza grande. Riempie le parti mancanti con zero byte. – svick

1

Il WriteLine sovraccarico si utilizza è questo:

TextWriter.WriteLine Method (Char[], Int32, Int32)

In particolare l'argomento IndexInFile fornito è in realtà l'indice nella tampone da cui iniziare la lettura non l'indice nella file in cui iniziare a scrivere - questo spiega perché stai scrivendo all'inizio del file non allo IndexInFile come previsto.

È necessario ottenere l'accesso al flusso sottostante e Seek alla posizione desiderata nel file, quindi scrivere sul file.

Problemi correlati