FileOpen

La función abre el archivo con el nombre especificado y las banderas especificadas.

int  FileOpen(
   string  file_name,           // nombre del archivo
   int     open_flags,          // combinación de banderas
   short   delimiter='\t',      // delimitador
   uint    codepage=CP_ACP      // página de código
   );

Parámetros

file_name

[in]  Nombre del archivo a abrir, puede contener subcarpetas. Si el archivo se abre para la escritura, las subcarpetas especificadas serán creadas en caso de que no existan.

open_flags

[in] combinación de banderas que determina el modo de trabajo con el archivo. Las banderas están definidas como sigue:
FILE_READ el archivo se abre para la lectura
FILE_WRITE el archivo se abre para la escritura
FILE_BIN modo binario de lectura-escritura (sin conversión de una cadena, ni tampoco en una cadena)
FILE_CSV archivo del tipo csv (todos los elementos grabados se convierten a las cadenas del tipo correspondiente, unicode o ansi, y se separan con un delimitador)
FILE_TXT archivo de texto simple (igual que el archivo csv pero sin tomar en cuenta los delimitadores)
FILE_ANSI cadenas del tipo ANSI (símbolos de un byte)
FILE_UNICODE cadenas del tipo UNICODE (símbolos de dos bytes)
FILE_SHARE_READ acceso compartido de lectura de parte de varios programas
FILE_SHARE_WRITE acceso compartido de escritura de parte de varios programas
FILE_COMMON ubicación del archivo en una carpeta compartida de todos los terminales de cliente \Terminal\Common\Files

delimiter='\t'

[in]  valor que se usa como un separador en el archivo txt o csv. Si para el archivo csv el delimitador no está especificado, por defecto se emplea el símbolo de tabulación. Si para el archivo txt el delimitador no está especificado, no se usa ningún separador. Si el valor 0 está establecido como un separador, no se utiliza ningún separador.

codepage=CP_ACP

[in]  Valor de la página de código. Están previstas las constantes correspondientes para las páginas de códigos más usadas.

Valor devuelto

En caso de abrir con éxito, la función devuelve el manejador del archivo que luego se usa para acceder a los datos del archivo. En caso de fallo devuelve INVALID_HANDLE.

Nota

Por razones de seguridad el trabajo con los archivos en el lenguaje MQL5 se encuentra bajo un estricto control. Los archivos con los que se realizan las operaciones de archivos utilizando los medios del lenguaje MQL5 no pueden estar fuera del entorno protegido de archivos (file sandbox).

Asegúrese de activar la bandera FILE_ANSI si el archivo debe ser leído en una codificación específica (se indica el parámetro codepage con el valor de la página de código). Si no indica la bandera FILE_ANSI, el archivo de texto se leerá en Unicode sin conversión alguna.

El archivo se abre en la carpeta del terminal de cliente en la subcarpeta MQL5\files (o catálogo_del_agente_de_simulación\MQL5\files en caso de prueba). Si entre las banderas está indicada FILE_COMMON, el archivo se abre en la carpeta compartida de todos los terminales de cliente de MetaTrader5.

"Las tuberías nombradas" pueden ser abiertas de acuerdo con las siguientes reglas:

  • El nombre de la tubería es la cadena que debe tener la siguiente apariencia: "\\servername\pipe\pipename", donde servername es el nombre del servidor en la red y pipename es el nombre de la tubería. Si las tuberías se utilizan en el mismo ordenador, se puede omitir el nombre del servidor, pero a su vez hay que poner un punto: "\\.\pipe\pipename". El cliente que intenta conectarse con la tubería tiene que saber su nombre.
  • Hay que llamar a las funciones FileFlush() y FileSeek() al inicio del archivo entre las operaciones consecutivas de lectura desde la tubería y la escritura en ella.

En las cadenas mostradas se utiliza un símbolo especial, la barra inversa '\'. Por eso, cuando se escribe el nombre en el programa MQL5, hace falta duplicar la barra inversa '\'. Es decir, escribir el ejemplo arriba mencionado en el código de la siguiente manera: "\\\\servername\\pipe\\pipename".

Puede encontrar más información sobre el trabajo con las tuberías nombradas en el artículo  "Communicating With MetaTrader 5 Using Named Pipes Without Using DLLs".

Ejemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- modo incorrecto de abrir un archivo
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Fallo al abrir el archivo por la ruta absoluta");
      Print("Código de error ",GetLastError());
     }
//--- modo correcto de operar en la zona protegida de archivos
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Operación FileOpen fallida, error ",GetLastError());
//--- otro ejemplo más de crear un directorio anidado dentro MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
      if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
      FileClose(filehandle);
      Print("El archivo debe ser creado en la carpeta "+terminal_data_path+"\\"+subfolder);
     }
   else Print("File open failed, error ",GetLastError());
  }

Véase también

Uso de página de código, FileFindFirst, FolderCreate, Banderas de apertura de archivos