Eliminación de un archivo y comprobación de su existencia

Comprobar si un archivo existe y eliminarlo son acciones críticas relacionadas con el sistema de archivos, es decir, con el entorno externo en el que «viven» los archivos. Hasta ahora, hemos visto funciones que manipulan el contenido interno de los archivos. A partir de esta sección, la atención se centrará en las funciones que gestionan los archivos como unidades indivisibles.

bool FileIsExist(const string filename, int flag = 0)

La función comprueba si existe un archivo con el nombre filename y devuelve true en caso afirmativo. El directorio de búsqueda se selecciona mediante el parámetro flag: si es 0 (valor por defecto), el archivo se busca en el directorio de la instancia del terminal actual (MQL5/Files); si flag es igual a FILE_COMMON, se comprueba el directorio común de todos los terminales Users/<user>...MetaQuotes/Terminal/Common/Files. Si el programa MQL se ejecuta en el probador, el directorio de trabajo se encuentra dentro de la carpeta del agente del probador (Tester/<agent>/MQL5/Files); véase una parte introductoria del capítulo Trabajar con archivos.

El nombre especificado puede no pertenecer a un archivo, sino a un directorio. En este caso, la función FileIsExist devolverá false y se registrará un pseudoerror 5018 (FILE_IS_DIRECTORY) en la variable _LastError.

bool FileDelete(const string filename, int flag = 0)

La función borra el archivo con el nombre especificado filename. El parámetro flag especifica la ubicación del archivo. Con el valor predeterminado, la eliminación se realiza en el directorio de trabajo de la instancia de terminal actual (MQL5/Files) o del agente del probador (Tester/<agent>/MQL5/Files) si el programa se está ejecutando en el probador. Si flag es igual a FILE_COMMON, el archivo debe estar ubicado en la carpeta común de todos los terminales (/Terminal/Common/Files).

La función devuelve un signo de éxito (true) o de error (false).

Esta función no permite borrar directorios. Para ello, utilice la función FolderDelete (véase Trabajar con carpetas).

Para ver cómo funcionan las funciones descritas, utilizaremos el script FileExist.mq5. Haremos varias manipulaciones con un archivo temporal.

const string filetemp = "MQL5Book/temp";
void OnStart()
{
   PRTF(FileIsExist(filetemp)); // false / FILE_NOT_EXIST(5019)
   PRTF(FileDelete(filetemp));  // false / FILE_NOT_EXIST(5019)
   
   int handle = PRTF(FileOpen(filetempFILE_TXT | FILE_WRITE | FILE_ANSI)); // 1
   
   PRTF(FileIsExist(filetemp)); // true
   PRTF(FileDelete(filetemp));  // false / CANNOT_DELETE_FILE(5006)
   
   FileClose(handle);
   
   PRTF(FileIsExist(filetemp)); // true
   PRTF(FileDelete(filetemp));  // true
   PRTF(FileIsExist(filetemp)); // false / FILE_NOT_EXIST(5019)
   
   PRTF(FileIsExist("MQL5Book")); // false / FILE_IS_DIRECTORY(5018)
   PRTF(FileDelete("MQL5Book"));  // false / FILE_IS_DIRECTORY(5018)
}

El archivo no existe inicialmente, por lo que ambas funciones, FileIsExist y FileDelet, devuelven false, y el código de error es 5019 (FILE_NOT_EXIST).

A continuación, creamos un archivo y la función FileIsExist informa de su presencia. No obstante, no se puede borrar porque está abierto y ocupado con nuestro proceso (código de error 5006, CANNOT_DELETE_FILE).

Una vez cerrado, el archivo puede borrarse.

Al final del script se comprueba el directorio «MQL5Book» y se intenta borrar. FileIsExist devuelve false porque no es un archivo; sin embargo, el código de error 5018 (FILE_IS_DIRECTORY) especifica que es un directorio.