2010-04-13 12 views
6

¿Es posible de manera eficiente insertar o eliminar bytes del medio de un archivo grande y, de ser así, cómo? ¿O estoy atascado reescribiendo todo el archivo después del punto donde se insertaron o eliminaron los datos?¿Cómo puedo insertar o eliminar bytes del medio de un archivo grande en .NET

[A lot of Bytes][Unwanted Bytes][A lot of Bytes] - > [A lot of Bytes][A lot of Bytes] 

or 

[A lot of Bytes][A lot of Bytes] - > [A lot of Bytes][New Inserted Bytes][A lot of Bytes] 

Respuesta

4

La manera más eficiente sería buscar la posición donde desea insertar el elemento, leer todo hasta el final, insertar el nuevo elemento y copiar el resto.

El problema no es el lenguaje, sino cómo se almacenan los datos en los medios, donde todo es solo una larga secuencia de bits. Puede imaginarlo como una sola tira de papel con los datos escritos en un bolígrafo. Si desea insertar algo, deberá rechazar todo lo que venga después. Por supuesto, si tienes un montón de espacio vacío entre bloques de datos, puedes insertar tus cosas ahí (que es la idea detrás de los Archivos dispersos), pero eso es poco eficiente en el uso del espacio.

1

Si se trata de un archivo plano, debe volver a escribir la parte después de las ediciones. Si se trata de un archivo con estructura lógica (por ejemplo, punteros a otras partes del archivo), las actualizaciones pueden ser muy eficientes.

2

No hay forma de insertar datos o eliminar datos en O (1) en C# ni en C++ ni en ningún lenguaje con API estándar o bibliotecas de clases.

Lo mejor que puede hacer es tener algún tipo de formato de archivo que defina usted mismo, podría admitir O (1) inserciones y eliminaciones. Pero probablemente tendrías que lidiar con la fragmentación.

También podría consultar una base de datos SQL como sqlite que se ocuparía de las complejidades para usted.

+0

Ni POSIX ni Windows, lo que significa que no es posible en ningún idioma. –

0

Tienes que copiar el archivo. En el mejor de los casos, puede escaparse usando Sparse Files, pero solo si 'Muchos bytes' son ceros.

Cuestiones relacionadas