Copiar fichero

Started by Yawin, September 19, 2013, 08:07:46 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

¡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?
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Rein (K´)ah Al-Ghul

usando el comando del sistema operativo para copiar ?

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Drumpi

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
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

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).
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

kim-elet-o

Y una cosa que no se si sera obvia, sobretodo cuando estes haciendo la copia del fichero de BBDD, no operes con la BBDD.


|/
|\im-elet-o el yayo programador.

Yawin

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.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Yawin

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
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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 ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)