Trabajar con archivos. - página 5

 
Yedelkin:

Pregunta 1: ¿Cree que hay un error tipográfico en la documentación, y que en lugar de "Fecha de última lectura" debería decir algo así como "Fecha de última apertura"?

Sí, aquí está la letra:

lpLastAccessTime [out, opcional]

Un puntero a una estructuraFILETIME para recibir la fecha y hora en que se accedió por última vez al archivo o directorio. La última hora de acceso incluye la última vez que el archivo o directorio fue escrito, leído o, en el caso de los archivos ejecutables, ejecutado.

Traducción libre: el último acceso incluye la última vez que el archivo fue leído o escrito o ejecutado (si es ejecutable).

Probablemente me equivoque en cuanto a la anulación de la manilla, pero también hay este texto interesante:

No todos los sistemas de archivos pueden registrar las horas de creación y de último acceso y no todos los sistemas de archivos las registran de la misma manera. Por ejemplo, en FAT, el tiempo de creación tiene una resolución de 10 milisegundos, el tiempo de escritura tiene una resolución de 2 segundos, y el tiempo de acceso tiene una resolución de 1 día (realmente, la fecha de acceso). Por lo tanto, es posible que la funciónGetFileTime no devuelva la misma información sobre la hora del archivo establecida mediante la función SetFileTime.

NTFS retrasa la actualización de la última hora de acceso a un archivo hasta una hora después del último acceso. NTFS también permite desactivar las actualizaciones de la última hora de acceso. La última hora de acceso no se actualiza por defecto en los volúmenes NTFS.

En la situación actual, se espera la felicidad cuando se recuperan las propiedades del archivo sin "reabrir" el mango.

Aparentemente, no hubo suerte, al menos en lo que respecta a los segundos.
 
TheXpert:

Sí, aquí está la letra:

Traducción libre: el último acceso incluye la última vez que el archivo fue leído o escrito o ejecutado (si es ejecutable).

Debo estar equivocado sobre la anulación de la manija, pero también hay este texto interesante:

Al parecer, no hay tanta suerte, al menos cuando se trata de segundos.

¡Gracias por la ampliación de la mente! Sí... Qué pena.

Este script dice que en lugar del identificador "Last read date" FILE_ACCESS_DATE devuelve la hora del último cierre del archivo:

int handle_file;
void OnStart()
  {
   Print("===============================================");
   handle_file=FileOpen("Ye_file2.bin",FILE_READ|FILE_WRITE|FILE_BIN);
   switch(handle_file)
     {
      case  INVALID_HANDLE: break;
      default:
         Print("Дата создания файла Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_CREATE_DATE));
         for(int i=0;i<3;i++)
           {
            Sleep(2000);
            FileReadInteger(handle_file,CHAR_VALUE);
            Print("Дата последнего чтения Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_ACCESS_DATE));
           }
         Sleep(3000);
         Print("Время обращения к FileClose(handle_file): ",TimeTradeServer());
         FileClose(handle_file);
     }
  }
 
TheXpert:

Pero a pesar de las conclusiones descabelladas, las pruebas son reveladoras, así que esperamos los comentarios de los desarrolladores sobre cómo funciona la función cuando no hay cambios.

Por cierto, en los últimos tres meses no he recibido ningún comentario, así que evito usarFileFlush() por el momento.
 

Me parece que FileFlush no debería ralentizar/acelerar el programa si se utiliza en lugar de FileClose.

No tiene sentido utilizarlo en bucle para cada registro. Imagina lo lento que sería Word si volviera a guardar cada vez que se modifica un documento (especialmente si ese documento tiene mucho texto e imágenes). FileFLush sólo facilita el guardado sin cerrar los archivos.

Los desarrolladores deben haber querido decir que (Por ejemplo):

OnInit - FileOpen

En el Tick - FileWrite FileFlush

(y aquí los datos se guardan -FileFlash- en el bucle, no en cada pasada del bucle, sino una vez terminado el bucle)

OnDeinit FileClose.

El objetivo de FileFlash es escribir en él todo el tiempo que se ejecuta el Asesor Experto, para no reinicializar constantemente el manejador de archivo y el místico buffer de archivo.

......niverse)

 
Yedelkin:
Por cierto, no he recibido ningún comentario en los últimos tres meses, así que he evitado utilizar FileFlush() por el momento.
De todos modos, no garantiza el ahorro inmediato. Así que sólo tiene sentido usarlo para guardar el estado actual sin cerrar el mango.
 
Yedelkin:
Por cierto, no he recibido ningún comentario en los últimos tres meses, así que evito usar FileFlush() por el momento.

Para entender mejor el significado del uso de la función FileFlush(), tenemos que pensar en el concepto de buffer de entrada/salida de archivos... Como sabes, la información del disco se almacena en bytes y escribir cada byte individualmente (a medida que llegan) es el colmo del despilfarro. Si se considera este proceso desde el punto de vista del "hardware", en cada solicitud de operación de escritura de bytes, el sistema operativo tendría que "menear la cabeza del escritor" de la unidad de disco duro. ¡Y un disco duro es cinemático! En otras palabras, es el más lento de todos los dispositivos informáticos. ¿Cuál es la solución entonces? Una solución muy sencilla. En la memoria del ordenador se crea un búfer de datos (normalmente es de unas decenas de kilobytes) en el que se envían los datos de la función FileWrite y similares. Tan pronto como este búfer se llene por completo, el sistema lo escribe por completo en un disco duro como el bloque continuo de datos, por lo que no se realiza la manipulación innecesaria de la cabeza de la unidad, y los datos se escriben simplemente en ¡UNA MÁQUINA! Ahora calcula cuántas veces aumenta la velocidad de escribir 32 kilobytes de información a la vez en comparación con escribir cada byte por separado del mismo tamaño ;) Y el cálculo es bastante sencillo... Para cada operación de escritura, primero se posiciona el cabezal de la unidad y luego se realiza la operación de escritura. Y eso sin entrar en todo el trabajo duro de una operación de lectura/escritura :) En el caso de un buffer, posicionamos el cabezal de la unidad una vez y escribimos todo el bloque en un solo flujo.

Pero, dicho esto, hasta que no se llene el buffer, los datos no aparecerán físicamente en el archivo (!!!), o hasta que se cierre el propio archivo, en cuyo caso el buffer (o más bien lo que queda en él) se escribe en el disco inmediatamente. Aquí es donde entra la función FileFlush. ¡Cuando usted "escribió" alguna información en el archivo y necesita que aparezca en el archivo (por ejemplo, esta información puede ser ya utilizada por otro programa, indicador, Asesor Experto...), entonces puede llamar a la función FileFlush, que volcará físicamente el contenido del buffer al disco (a un archivo)!

¡Conclusión: El uso frecuente de la función FileFlush o su uso en bucles, para acelerar el trabajo con el archivo, dará justo el resultado contrario, porque en cada llamada, el sistema necesita calcular la cantidad de información realmente contenida en el buffer de E/S, llamar al sistema operativo y dar la orden de escribir esta sección de memoria en el archivo! Por ejemplo, el bucle escribe un byte en el archivo e inmediatamente llama a la función FileFlush, obtenemos la forma más lenta de escribir en el disco ¡¡¡FONDO!!! ;)

¿Cuál es la forma más rápida de escribir en un archivo? Muy sencillo ;) No se complique y torture a FileFlush :) En este caso se consigue un rápido intercambio de datos entre FileWrite y el portapapeles (la manipulación de la memoria es la más rápida). El sistema vigilará el desbordamiento de este búfer y, si es necesario, transmitirá los datos (¡la operación más rápida con un dispositivo tan torpe como un disco duro!) y borrará el búfer para recibir nuevos datos!

Entonces surge la pregunta: "¿Por qué se necesita la función FileFlush?". Y la respuesta es sencilla: es necesario cuando se necesita que los datos se escriban físicamente en el archivo, independientemente del llenado del buffer. Más arriba he dado un ejemplo de esa necesidad.

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - Документация по MQL5
 

Tuve que reescribir mi indicador para MQL5 y me encontré con una gran confusión :(

Aquí está el código:

  first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
  
  //--- установим доступ к массиву как к таймсерии
  ResetLastError();
  int copied=CopyTime(NULL,0,0,first_bar,TimeAsSeries);
  del();
  int handle=FileOpen("Price Label\\"+_Symbol+tpl_ext,FILE_READ|FILE_CSV,';',CP_ACP);
  int er=GetLastError();
  ResetLastError();
  
  string sTF="";
  int TF;
  string period_name;
  string price_label;
  string price1;
  string price2;
  
  if (handle>=1){
    while(FileIsEnding(handle)==false){
      sTF = FileReadString(handle);
      TF = ResolveTF(sTF);
      period_name=FileReadString(handle);
      price_label=FileReadString(handle);
      price1=FileReadString(handle);
      price2=FileReadString(handle);
      drawe_price(TF,handle,period_name,price_label,price1,price2);
    }
    FileClose(handle);
  }
  return(0);

Quiero explicar de inmediato que he introducido un número tan grande de variables para ver lo que está pasando en el depurador. Y vi...

El archivo contiene un montón de cadenas, cada cadena tiene 5 secciones divididas por ";". La primera llamada

sTF = FileReadString(handle);

pone todo el archivo en la variable sTF, en una codificación incomprensible. A juzgar por lo que veo en el depurador (¡en la variable sTF lee el contenido del archivo como unicode! Al abrir el archivo, he probado todas las páginas de código disponibles, pero el resultado es el mismo :( El archivo en sí está escrito en codificación Windows.

¿Alguien tiene idea de dónde está enterrado el perro?

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
Файловые операции / FileOpen - Документация по MQL5
 

is_vale

Gracias a todos por compartir la información. Me sumergiré de nuevo en el tema.

 
FILE_ANSI
 
is_vale:

¿Alguien tiene idea de dónde está el problema?

Hace tiempo que no trabajo con operaciones de archivos... Mira, cuando usas FileOpen() tienes un archivo CSV declarado. Sirve para especificar que todos los elementos escritos se conviertan en cadenas unicode o ansi. ¿Tal vez aquí es donde está el perro?