¡Hola a todos!
Continúo con mi motor RPG y, el caso es, que tengo un problemilla. Necesito copiar un fichero. Pero no es un simple fichero que pueda abrir, recoger el contenido y cerrar para volcar lo recogido en un nuevo fichero. Es una base de datos de SQLite.
¿A alguno se le ocurre cómo podría hacerlo?
usando el comando del sistema operativo para copiar ?
Pues si quieres hacerlo con Bennu, es abrirlo en modo lectura, abrir un archivo de copia en el destino en modo escritura, e ir byte a byte. Da igual que sea un fichero de BBDD, un ejecutable o el Quijote en verso, un fichero es un fichero y una copia tiene exactamente los mismos bytes en su interior. No conozco ningún formato cuyo contenido dependa directamente del nombre o ubicación que se le ponga.
Un caso aparte es que quieras darle los mismos permisos y atributos (lectura, escritura, oculto...) que el original, pero eso ya depende del SO en el que estés, y tendrás que hacerlo a mano, bien con las propiedades o usando comandos del sistema.
O puedes usar el método de Rein, al fin y al cabo, los ficheros de BBDD se crearon para ser copiados y trasladados entre sistemas :P
O sea que si abro y copio byte a byte no me cargo nada?
Es que estoy por hacer un mod_yawin.dll que incluya mis fórmulas mágicas que nunca encuentro y acabo creando yo (como esta, for exampol).
Haz la prueba. Copia la base de datos con tu código y sustituye la original por esa copia (obviamente, no borres la original, por si acaso :D), a ver si esa BBDD sigue fncionando.
Pero ya digo, yo lo usé para copiar un FPG comprimido a un fichero sin comprimir: es decir, lo abrí con O_ZREAD y lo guardé en otro con O_WRITE, y obtuve el mismo FPG sin compresión y sin crear el algoritmo de descompresión :LOL:
Pero lo dicho, debes ir BYTE a BYTE (para evitar problemas de big y little endian) y el nuevo fichero no va a tener los permisos de lectura/escritura/ejecución del original, por si vas a leer un fichero de sólo lectura o con permisos exclusivos para el administrador.
Y una cosa que no se si sera obvia, sobretodo cuando estes haciendo la copia del fichero de BBDD, no operes con la BBDD.
xDDD Creo que es obvio y tal. De hecho lo que hago es, cierro la bd, la borro y hago una copia de la original. De esa forma puedo resetear la partida sin tener que tener tablas duplicadas o cosas así.
Aún no he tenido tiempo de ponerme a esto, así que avisaré cuando tenga algo.
Vale, ahora que he tenido tiempo lo he programado y me ha funcionado. dejo aquí mi función por si a alguien le viene bien:
function fcopia(string origen, string destino)
private
int pfich,pfich2;
int dato;
end
begin
pfich=fopen(origen,0);
pfich2=fopen(destino,2);
repeat
fread(pfich,dato);
fwrite(pfich2,dato);
until(feof(pfich));
end
Como te dije, te recomiendo que "dato" sea de tipo BYTE en lugar de INT, por aquello de los indios grandes y pequeños :D
(Big y Little endian).
Y ten cuidad con los ficheros vacíos ;)