2011-11-23 20 views
8

Estoy haciendo una aplicación en C#. En esa aplicación, tengo una matriz de bytes y quiero escribir los datos de la matriz de bytes en una posición particular.¿Cómo escribir datos en una posición particular en C#?

Aquí usé la siguiente lógica.

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

Pero cada vez que escribo datos en un archivo, comienza a escribir desde el inicio.

Mi condición es que supongo que en el archivo inicial tengo vacío y quiero comenzar a escribir en el archivo desde la posición 10000. Por favor, ayúdenme. Gracias de antemano.

+0

Recibo un error como 'System.IO.IOException: no se puede buscar hacia atrás para sobrescribir los datos que existían anteriormente en un archivo abierto en el modo Añadir. en System.IO.FileStream.Seek (desplazamiento de Int64, origen de SeekOrigin) ' – Dany

Respuesta

10

Nunca intente escribir datos binarios como cadenas, como usted. No funcionará correctamente. Escribe datos binarios como datos binarios. Puede usar Stream para eso en lugar de StreamWriter.

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

lo usé pero recibo un error como System.IO.IOException: no se puede buscar hacia atrás para sobrescribir los datos que existían previamente en un archivo abierto en el modo Agregar. en System.IO.FileStream.Seek (desplazamiento de Int64, origen de SeekOrigin) – Dany

+2

Luego, no use 'FileMode.Append'. – svick

+0

Pero quiero agregar los datos. ¿Entonces qué haré? – Dany

1

Tal vez un poco hacky, pero puede acceder a la propiedad BaseStream del StreamWriter y usar Seek(long offset, SeekOrigin origin) en él. (Pero cuidado, ya que no todas las corrientes puede utilizar Seek.)

3

Es posible ajustar la posición dentro de la corriente de la siguiente manera:

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

Añadir esto antes de su código WriteLine.

Tenga en cuenta que no he incluido ningún código para comprobar que hay al menos 1000 caracteres dentro del archivo para comenzar.

+0

Creo que 'Seek()' funciona bien incluso si el archivo no es lo suficientemente grande. Llena las partes faltantes con cero bytes. – svick

1

La sobrecarga WriteLine que está utilizando es éste:

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

En particular, el argumento IndexInFile suministrada es en realidad el índice en el búfer de partida para comenzar a leer no el índice en el archivo en el cual comenzar a escribir: esto explica por qué está escribiendo al comienzo del archivo, no en IndexInFile como esperaba.

Debe obtener acceso a la secuencia subyacente y Seek primero a la posición deseada en el archivo y luego escribir en el archivo.

Cuestiones relacionadas