Trabajar con archivos. - página 3

 
Yedelkin:
"Cuando se cierra un archivo, los datos se restablecen automáticamente en el disco, por lo que no es necesario llamar a FileFlush() antes de llamar a FileClose()" - Sí, sí, empiezo a ver de qué hablabasargazo. Entonces, ¿resulta que en lugar de FileClose() se puede llamar a FileFlush() para garantizar que se guarda el último registro en el archivo? ¿Y esto sería una solución inteligente?

no en lugar de, sino por necesidad.

Flush - restablece los datos restantes, y NO cierra el archivo. Esto es lo que quieres, ¿verdad?

Cerrar: restablece el resto de los datos en el disco y se cierra.

 
sergeev:

no en lugar de, sino por necesidad.

Flush - restablece los datos restantes, y NO cierra el archivo. Esto es lo que quieres, ¿verdad?

Cerrar - borra los datos restantes en el disco y se cierra.

Sí, eso es exactamente de lo que estamos hablando. ¡Gracias por el consejo sobre una solución inteligente!
 
Yedelkin:

Algo sobre la minimización del tiempo usando FileFlush() no funciona muy bien:

2011.05.29 21:58:20 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 133766
2011.05.29 22:00:33 FlushSave (EURGBP,M1) FileClose. GetTickCount() = 133734
De hecho, ambas funciones tardan el mismo tiempo en funcionar.

Según he entendido esta línea mueve la posición al principio del archivo sin desplazamiento. Esto permite sobrescribir la información existente (es decir, la fecha se actualiza, pero no se acumula en el archivo).

FileSeek(handle_file,0,SEEK_SET);

Al utilizar move to end of file en lugar de SEEK_SET, los datos se amontonarían en el archivo.

 
Yedelkin:

Se abre un nuevo manejador de archivo cada vez que se descarga. ¿Para qué? Y por cierto, no lo cierras.

La ventaja de la función FileFlush es que no es necesario volver a abrir el mango.

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

1. Según tengo entendido, esta línea mueve la posición en el archivo sin desplazamiento. Esto permite sobrescribir la información existente (es decir, la fecha se actualiza pero no se acumula en el archivo)

Así, si se utiliza en lugar de SEEK_SET saltar al final del archivo, los datos se acumularán en el archivo.
Ya ha tenido tiempo de borrar mi mensaje. Allí en el ejemplo se insertó FileFlush() después de escribir en el archivo.
 
TheXpert:

Se abre un nuevo manejador de archivo cada vez que se descarga. ¿Para qué? Y por cierto, no lo cierras.

La ventaja de la función FileFlush es que no es necesario volver a abrir el mango.

Lo hice así:

int handle_file;
datetime t;
uint u;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---пример с функцией FileFlush()
   u=GetTickCount();
   handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);
//for(int i=0;i<100000;i++)
   for(int i=0;i<1000;i++)
     {
      if(handle_file!=INVALID_HANDLE)
        {
         t=TimeLocal();
         FileSeek(handle_file,0,SEEK_SET);
         FileFlush(handle_file);
         FileWrite(handle_file,t);
        }
     }
   FileClose(handle_file);
   Print("FileFlush. GetTickCount() = ",GetTickCount()-u);

//---пример без функции FileFlush()
   u=GetTickCount();
   for(int i=0;i<1000;i++)
     {
      handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);
      if(handle_file!=INVALID_HANDLE)
        {
         t=TimeLocal();
         FileSeek(handle_file,0,SEEK_SET);
         FileWrite(handle_file,t);
         FileClose(handle_file);
        }
     }
   Print("FileClose. GetTickCount() = ",GetTickCount()-u);
  }

Resultado:

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose. GetTickCount() = 531

Cambié las líneas, según la documentación:

         FileFlush(handle_file);
         FileWrite(handle_file,t);
Pero no entiendo el sentido de llamar a FileFlush() antes de FileWrite().
 
Yedelkin:

Lo hice así:

Resultado:

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose. GetTickCount() = 531

Intercambié las líneas, según la documentación:

Pero aún no se ha entendido el sentido de llamar a FileFlush() antes de FileWrite().

Aquí está la variante:

int handle_file;
datetime t;
uint u;

void OnStart()
{
//---пример с функцией FileFlush()
u=GetTickCount();

handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);

  for(int i=0;i<1000;i++)
  {
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileFlush(handle_file);
    FileWrite(handle_file,t);
    }
  }

FileClose(handle_file);

Print("FileFlush. GetTickCount() = ",GetTickCount()-u);

}

El resultado es FileFlush. GetTickCount() = 26125

Aquí está la variante:

int handle_file;
datetime t;
uint u;

void OnStart()
{
//---пример без функции FileFlush()
u=GetTickCount();

  for(int i=0;i<1000;i++)
  {
  handle_file=FileOpen("Ye_file2.txt",FILE_READ|FILE_WRITE|FILE_TXT);
      
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileWrite(handle_file,t);
    FileClose(handle_file);
    }

  }

Print("FileClose. GetTickCount() = ",GetTickCount()-u);

}
El resultado es FileClose. GetTickCount() = 3969
 

Esta opción dio un resultado entre 47 y 110

int handle_file;
datetime t;
uint u;

void OnStart()
{

u=GetTickCount();

handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);

  for(int i=0;i<1000;i++)
  {
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileWrite(handle_file,t);
    }
  }

FileClose(handle_file);

Print("FileFlush. GetTickCount() = ",GetTickCount()-u);

}

1. Conclusión - El uso de FileFlush en un bucle ralentiza la ejecución unas 260 veces.

2. Un bucle para 50.000 registros en esta variante tiene el siguiente resultado - FileFlush. GetTickCount() = 1891.

3. No conseguí matar el terminal al ejecutar el ciclo de 50000 escrituras sin salir del archivo (cerré el terminal y "maté" el proceso).

4. Pude matar a la terminal con 100000 de bucle, y el archivo contenía más de 65536 registros (tanto espacio en Excel 2003).

 
Yedelkin:

He intercambiado las líneas según la documentación:

¿Dónde lo dice la documentación?

Pero sigo sin entender el sentido de llamar a FileFlush() antes de FileWrite().

¿Cómo se puede dar sentido a algo que no lo tiene? Devuelve el orden de las cadenas y vuelve a comprobarlo. Al parecer, la documentación no lo expresaba correctamente.

Pero... Gracias a tus pruebas, parece que se ha detectado el error: FileFlush parece consumir una cantidad de tiempo desmesurada cuando no se realizan cambios.

Interesante:

¡OMG! Es donde se deduce que es un marasmo. Así aparecen afirmaciones como "la POO es más rápida" o "los indicadores son lentos, deberíamos trasladar todo el código al Asesor Experto".

 
papaklass:

Experto, escriba cómo utilizar esta función correctamente.

Hipotéticamente sí:

// open handle
for(int i=0;i<1000;i++)
  {
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileWrite(handle_file,t);
    FileFlush(handle_file);
    }
  }
// close handle

Es decir, es correcto comparar el paquete FileClose -- FileOpen con FileFlush.

Teóricamente, FileFlush debería ser una parte de FileClose y no podría ser más lento que el paquete.

No tiene sentido tirar de los cambios antes de que aparezcan, porque todavía no están ahí :)

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