Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Verificación de los datos grabados en CD o DVD (https://www.clubdelphi.com/foros/showthread.php?t=39267)

rretamar 15-01-2007 21:14:03

Verificación de los datos grabados en CD o DVD
 
Hola.
Tengo escrita una pequeña aplicación que toma los archivos de un directorio y los graba en CD o DVD. La grabación funciona sin problemas.

Hoy necesito agregarle la posibilidad de verificar que los datos del CD o DVD recién grabado se hayan escrito correctamente (como la opción "verificar datos escritos" en programas como Nero). La implementación en principio es simple, ya que me limito a leer archivo por archivo en el CD o DVD, y voy comparándolos con los que están en el disco rígido.

El problema es que al ser un CD recién grabado, la lectura que realizo se está realizando desde la caché (o sea en memoria) y no fisicamente desde el CD recién grabado.

Obviamente me dice que todos los archivos son idénticos :D, pero la pregunta es cómo puedo hacer (¿ vaciar la cache ?) para que la lectura se haga desde el CD, como lo hace cualquier programa (Nero, por ejemplo) de grabación de CD.

Saludos cordiales desde Argentina, Tux

dec 15-01-2007 21:22:45

Hola,

No me queda claro lo que dices de que la "lectura la realizas desde la caché". Si tienes que comparar los archivos. Si tú lees un archivo "E:\archivo.bmp" siendo "E" la letra del disco recién grabado... ¿cómo es eso de que lees el archivo desde la caché? No me queda claro.

Habría que ver también si guardas las rutas de los archivos grabados... para ir "comparándolos" con los archivos originales. Y entrecomillo "comparándolos" porque se me ocurre que puedes compararlos por su "MD5", por ejemplo, o de otro(s) modo(s)...

No sé. Yo creo que habría que aclarar unas cuantas cosas antes de echar para adelante...

A mí el asunto puede parecerme al principio no demasiado complicado, pero, cuando lo piensas un poco...

seoane 15-01-2007 21:46:52

Lo que voy a decir puede que sea una tontería, pero puedes abrir y luego volver a cerrar la bandeja del cd, de esta manera sera como si insertaras un disco nuevo y no influiría la cache.

Es todo lo que puedo decirte por ahora, ya que no dices que método estas utilizando para grabar, ni que librerías utilizas (si lo haces) o si usas alguna aplicación de terceros.

dec 15-01-2007 21:56:51

Hola,

Yo sigo sin ver dónde entra la "caché" esa (claro que tampoco sé de dónde sale). Lo digo en serio, si estoy confundido me lo hacéis saber por favor. Porque si suponemos que existe un disco en la unidad "E" (pongamos por caso) y yo escribo esto:

Código Delphi [-]
if FileExists('E:\archivo.bmp') then
  ShowMessage('El archivo existe');

¿Qué se supone que estoy "preguntando"? ¿Si existe el archivo en la "caché"? No, señor. Estoy preguntando si existe un archivo en la ruta que indico: ¿y no se me va a responder si existe o no existe? ¿Dónde entra ahí la "caché"?

Desde la ignorancia acreditada que me caracteriza, espero que me ilumine vuestra sin duda ilustrada ayuda. :D

rretamar 15-01-2007 22:08:33

Desde ya les agradezco por su respuesta

La cosa es así:
1) Grabo unos archivos usando un componente de Delphi para grabación en CD/DVD.
2) Cuando termino de grabar deseo realizar una verificación de los archivos grabados.
3) Abro y cierro la tapa de la grabadora, pero el caché de Windows 2000 no se vacía. Cuando trato de leer los archivos de la grabadora para realizar la comparación con los del rígido, los lee del caché y no del CD/DVD en sí.

En definitiva necesito vaciar la caché de Windows para esa unidad, pero no se como. El Nero lo hace sin siquiera abrir la tapa....

Saludos cordiales desde Argentina, Tux

dec 15-01-2007 23:06:19

Hola,

Yo entiendo que el componente que estés utilizando para grabar en el CD tiene que proporcionarte la posibilidad de lidiar con la caché famosa. Pero, aún sí, sigo sin comprender cómo si yo trato de averiguar si existe un archivo en el CD Windows me va a decir una cosa u otra mirando en la caché... ¿pero no le estoy dando la ruta del archivo que quiero? ¿Entonces a qué se mete la caché por medio? Sigo sin comprenderlo, la verdad.

rretamar 16-01-2007 00:31:50

Hola.
No tengo control si la lectura se realizará desde la caché de lectura del sistema operativo o del mismo CD. Me doy cuenta que se realiza desde la cache porque al leer los archivos del CD recién escrito la luz de la unidad ni se enciende, y la lectura es rapidísima. Eso lo controla el sistema operativo. He probado expulsar el CD y volverlo a insertar, pero Windows se da cuenta que es el mismo CD (por el número de serie) y la lectura la realiza desde la cache de lectura.

El componente que estoy usando (MagicBurner) solo controla la parte de grabación, pero no veo que tenga ninguna funcion para vaciar la cache de lectura de unidades removibles.

Poder se que se puede, sin ir más lejos Nero lo hace cuando activamos la opción de "verificar los datos escritos".


Saludos desde Argentina, Tux :(

dec 16-01-2007 00:54:46

Hola,

A ver... no sabemos qué hace Nero, ¿verdad? Tú dices que no tienes control sobre si la lectura se realizará desde la caché del sistema operativo o desde el CD, pero, ¿esto cómo es posible?

Si eres tú quien implementa la comprobación de los archivos, eres tú el que tiene que codificar lo que sea menester para llevar a cabo la tarea. Ahora bien, tú grabaste los datos en el CD... y hasta aquí la participación de la caché del sistema operativo y del componente MagicBurner.

A partir de ahí (en mi ignorante opinión) eres tú quien debe implementar la comprobación de los archivos grabados. Y ya me dirás porqué no puedes hacerlo como quieras...

Es decir, si guardas antes de grabar las rutas de los archivos a grabar, por un lado, y luego compruebas que los archivos están donde deben estar en el CD... hágase esto como se tenga que hacer, repito que no sé dónde entra la caché del sistema operativo...

Pongamos por caso que grabas el archivo "C:\archivo.bmp" en el CD que se encuentra en la unidad "E". Para comprobar que el archivo se grabó correctamente una posible forma sería obtener el MD5 del archivo "C:\archivo.bmp" y compararlo con el del archivo "E:\archivo.bmp". Evidentemente este último ha de existir: de no ser así ya sabríamos que la grabación no terminó correctamente.

Pero tú para comprobar la existencia del archivo "E:\archivo.bmp" utilizarás la función "FileExists" (por simplificar el ejemplo) y le dirás al sistema operativo que te diga si el archivo "E:\archivo.bmp" existe o no existe: no si existe en la caché o no existe en la caché, sino si existe el archivo "E:\archivo.bmp". Así que no sé si me estoy perdiendo algo o qué...

roman 16-01-2007 00:58:08

¿No te servirá la función FlushFileBuffers?

// Saludos

rretamar 16-01-2007 02:39:33

Cita:

Empezado por dec
Pongamos por caso que grabas el archivo "C:\archivo.bmp" en el CD que se encuentra en la unidad "E". Para comprobar que el archivo se grabó correctamente una posible forma sería obtener el MD5 del archivo "C:\archivo.bmp" y compararlo con el del archivo "E:\archivo.bmp". Evidentemente este último ha de existir: de no ser así ya sabríamos que la grabación no terminó correctamente.

Pero tú para comprobar la existencia del archivo "E:\archivo.bmp" utilizarás la función "FileExists" (por simplificar el ejemplo) y le dirás al sistema operativo que te diga si el archivo "E:\archivo.bmp" existe o no existe: no si existe en la caché o no existe en la caché, sino si existe el archivo "E:\archivo.bmp". Así que no sé si me estoy perdiendo algo o qué...

Lo haga con md5sum, o con una función de comparación en memoria usando streams, lo haga de la forma en que lo haga, el problema no es ese. El problema está en la cache de lectura que Windows implementa en las unidades removibles, en este caso la grabadora de CD. Esta cache hace que al CD recien grabado no me lo lea fisicamente.

El problema es (voy a usar las letras de unidades de tu mensaje) es que cuando leo la unidad E: ,no me lee fisicamente el CD, sino que (al ser pocos datos los que grabo en el CD, 150 Mb como mucho) a los archivos los lee de la memoria (ya que Windows cachea las lecturas en las unidades removibles, y al ser un CD recién grabado, entonces su contenido está "cacheado"). Y al no leer fisicamente el CD, entonces NO puedo verificar si REALMENTE los datos se grabaron correctamente.

Gracias por la paciencia...

Saludos desde Argentina, Tux :p

dec 16-01-2007 02:44:22

Hola,

Pues muy bien puedes llevar razón. Aunque yo sigo sin entender cómo es posible que intente averiguar si existe el archivo "E:\archivo.bmp" y el sistema operativo me responda si existe o no "en la caché". No es eso lo que quiero saber: quiero saber si existe el archivo "E:\archivo.bmp".

Quiero decir que la caché estará estupenda para otros menesteres, pero, cuando uno no quiere saber si existe un archivo en la caché sino en una ruta en concreto, lo suyo (digo yo... vamos, que lo mismo estoy diciendo estupideces) es que se me respondiera si existe o no el archivo en la ruta que especifico.

De hecho si uno mira la ayuda sobre la función "FileExists", por ejemplo, en ningún lado se dice "Si el archivo está en una unidad removible es posible que esta función retorne "True" aunque el archivo no se encuentre en la ruta especificada...". Por ningún lado pone eso, así que ya me diréis qué pensáis sobre esto...

seoane 16-01-2007 02:48:27

:D Me parece dec que no estas entendiendo a rretamar, el no quiere saber si el archivo existe. El quiere leer su contenido para poder compararlo con el archivo original.

roman 16-01-2007 02:52:22

Una pregunta ingenua: ¿que el caché no debería de ser lo suficientemente inteligente para determinar si debe comparar con la versión en memoria o la de disco? Es que yo, de verdad, no tengo idea de como funciona el caché.

// Saludos

dec 16-01-2007 02:56:42

Hola,

Bueno. Pero es que es lo mismo (en mi ignorancia). Si yo le digo a Windows lee este archivo... estoy diciéndole justamente eso: lee este archivo... no el que tengas en tu caché... lo de si existe el archivo es una forma de simplificar el razonamiento (si lo es) pero vendría a ser lo mismo en lo referente a leer el archivo: EL QUE YO DIGA, no el que Windows decida...

Ahora bien, no estoy quitando la razón al compañero... ya he dicho que bien puede ser que suceda tal como dice él...

seoane 16-01-2007 03:02:43

Cita:

Empezado por roman
Una pregunta ingenua: ¿que el caché no debería de ser lo suficientemente inteligente para determinar si debe comparar con la versión en memoria o la de disco? Es que yo, de verdad, no tengo idea de como funciona el caché.

Yo, si te digo la verdad, tampoco estoy seguro de que cache estamos hablando. Porque una cosa es copiar archivos desde el explorador de windows a un disquete y luego intentar leerlos de nuevo, por si nunca habéis probado, windows no lee los archivos del disquete sino que lo hace desde la cache. Pero en el caso de una grabadora de Cd es diferente, la información se graba en bruto en el grabadora desde el propio programa, así que cuando intentemos acceder a un archivo del cd no creo que este almacenado en ninguna cache. Son cosas completamente diferentes. O eso creo yo ...

Otra cosa seria si el programa utilizara la propia api de windows para copiar los archivos al cd, entonces puede que windows mantuviera una copia local de los mismos, pero esto ya son suposiciones ...

Lo dicho, yo no tengo muy claro de que cache estamos hablando ... :confused:

rretamar 16-01-2007 03:19:11

Hagamos una simple prueba que refleja lo que estoy comentando:

1) Desde el explorador de Windows, vas a la unidad de CD, eliges una carpeta que contenga (por ejemplo) varios archivos que ocupan 30 Mb, y a través de copiar-pegar los copias a otra carpeta del disco rígido.

2) Durante la copia, la unidad de CD se enciende y los archivos se leen de allí.

3) Desde el explorador eliges la misma carpeta de la unidad de CD, y copias esos datos a una carpeta del disco rígido diferente a la de 1)

Sorpresa...la copia en este caso es mucho más rápida...y la unidad de CD ni se mueve. Es que Windows tiene en la cache de disco los datos de la unidad de CD, y los lee de allí.

Esa es la idea de la caché....acelerar el acceso manteniendo en memoria los últimos datos leídos, y -como la memoria es limitada- ir descartando de la caché los datos "menos solicitados". En situaciones normales esto es una bendición, ya que los accesos redundantes (como en este ejemplo) son mucho más veloces. Pero para realizar la verificación de los datos recientemente escritos en la unidad de CD por mi programa y al ser estos leídos de la cache, entonces no se realiza la lectura "física" y no puedo leer REALMENTE los datos del CD, que es lo que quiero.

Espero que no los canse con este "ladrillo".

Saludos desde ARgentina, Tux :)

dec 16-01-2007 03:31:50

Hola,

A mí personalmente no me cansa en absoluto, pero, es que lo que dices no responde a mi inquietud. Si Windows utiliza una caché para copiar archivos desde un CD al disco duro, es decir, si la primera copia la hace desde el CD y sucesivas copias las hace a partir de su caché... es problema de Windows, y yo estaré contento de que lo haga lo más rápido posible así que todos contentos.

Pero en este caso no se trata de Windows, se trata de mi programa. Y mi programa quiere saber si existe un archivo en la ruta "E:\archivo.bmp" y no le interesa para nada la caché y aquí Windows no tendría que contradecirme y decirme si existe el archivo o no existe el archivo en no sé qué caché: mi pregunta es simple, ¿existe el archivo "E:\archivo.bmp"? Y Windows tiene que limitarse a contestar a esa pregunta.

Tú no puedes controlar que Windows use no sé qué caché en sus tareas, pero, sí que puedes controlar que en tu programa se inquiera la existencia de un archivo en determinada ruta: no en ninguna caché ni en otro sitio distinto, exactamente en la ruta que le indicas. Y aquí vuelvo otra vez a la documentación de la función "FileExists", por ejemplo: en ningún lado se menciona que retornará "True" si el archivo solicitado existe en no sé qué caché. Es decir, esta función retornará "True" si el archivo "E:\archivo.bmp" existe y "False" en cualquier otro caso.

Ahora bien, ya me atrevo a preguntar... ¿tú lo has comprobado? Es decir, realmente la función "FileExists" te retorna "True" para un archivo "E:\archivo.bmp" que no existe en el cederrón, porque el mismo cederrón no se encuentre ya en el dispositivo sin ir más lejos? Porque yo me apuesto algo (je, je, je...) que si el cederrón no está en la unidad la función "FileExists" no puede retornar "True" en modo alguno si se le pasa como parámetro la ruta de un archivo que haya de estar en dicha unidad/cederrón.

roman 16-01-2007 03:54:24

Yo creo compartir la inquietud de dec. El sistema de caché debe funcionar de forma tal que no haya errores, de lo contrario sería altamente ineficaz, porque no sólo interviene aquí, sino en muchas operaciones de disco. Ahora, esto lo digo desde mi lógica, pero como ya mencioné, sé nada acerca del asunto.

Aún así, pregunto: ¿qué te hace (rretamar), asegurar que va a fallar por estar leyendo del caché? Sé que no tiene mucho sentido lo que pregunto. Pero ¿no se podría hacer una prueba haciendo fallar a propósito la copia en unos cuantos bytes por ahí? Si la verificación, tal como se hace ahora, sigue diciendo que todo está bien, pues habremos concluido que en efecto es culpa del caché.

// Saludos

dec 16-01-2007 03:58:24

Hola,

Yo propongo una prueba muuuuuuuuuuuuuuy sencilla. Graba en un cederrón un par de archivos y a continuación (quitando el cederrón de la unidad) usa la función "FileExists" para tratar de averiguar si dichos archivos están el cederrón. Si la función te devuelve "True"... me la corto, como suele decirse. :D :D

rretamar 16-01-2007 04:00:16

Cita:

Empezado por dec
Pero en este caso no se trata de Windows, se trata de mi programa. Y mi programa quiere saber si existe un archivo en la ruta "E:\archivo.bmp" y no le interesa para nada la caché y aquí Windows no tendría que contradecirme y decirme si existe el archivo o no existe el archivo en no sé qué caché: mi pregunta es simple, ¿existe el archivo "E:\archivo.bmp"? Y Windows tiene que limitarse a contestar a esa pregunta.

Windows te dice que el archivo existe, pero no lo lee de la unidad de CD, sino de la memoria. Es transparente para las aplicaciones, como bien lo muestra el ejemplo de copiar archivos que puse en el programa anterior.

Cita:

Empezado por dec
Tú no puedes controlar que Windows use no sé qué caché en sus tareas, pero, sí que puedes controlar que en tu programa se inquiera la existencia de un archivo en determinada ruta: no en ninguna caché ni en otro sitio distinto, exactamente en la ruta que le indicas. Y aquí vuelvo otra vez a la documentación de la función "FileExists", por ejemplo: en ningún lado se menciona que retornará "True" si el archivo solicitado existe en no sé qué caché. Es decir, esta función retornará "True" si el archivo "E:\archivo.bmp" existe y "False" en cualquier otro caso.

Ahora bien, ya me atrevo a preguntar... ¿tú lo has comprobado? Es decir, realmente la función "FileExists" te retorna "True" para un archivo "E:\archivo.bmp" que no existe en el cederrón, porque el mismo cederrón no se encuentre ya en el dispositivo sin ir más lejos? Porque yo me apuesto algo (je, je, je...) que si el cederrón no está en la unidad la función "FileExists" no puede retornar "True" en modo alguno si se le pasa como parámetro la ruta de un archivo que haya de estar en dicha unidad/cederrón.

El problema es que no solamente necesito que el archivo exista (fileexists), sino que quiero leer su contenido, para compararlo con el que está en el disco rígido y ver SI LA ESCRITURA EN EL CD SE REALIZO CORRECTAMENTE.

Los pasos que hace mi programa son:

1) Hay unos archivos en una carpeta del disco rígido.

2) A esos archivos los grabo en la unidad de CD, con el componente Magicburner.

En este momento, Windows guarda una copia de los datos escritos en la cache de disco, como hace con todas las unidades. Eso lo hace en forma transparente.

3) Al terminar la grabación, leo con mi programa la unidad de CD y comparo el contenido (archivo por archivo) con los que están en el disco rígido. De esa forma debería poder comprobar que se grabaron correctamente en el CD, o sea QUE SON LEGIBLES DESDE EL CD.

Es el paso 3 el que no está funcionando, por culpa de la cache que windows implementa en las unidades.

Y ahí es donde aparece el problema, porque al empezar a leerlos la unidad de CD ni se mueve, sin embargo los puedo leer, porque están cacheados en memoria. Y al no poderlos leer fisicamente desde el CD, entonces no puedo saber si la grabación se realizó correctamente.

Saludos , Tux


La franja horaria es GMT +2. Ahora son las 17:19:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi