Удаление и проверка на существование файла

Проверка файла на существование и его удаление — критически важные действия, относящиеся к файловой системе: внешней среде, в которой "живут" файлы. До сих пор мы рассматривали функции, которые манипулируют внутренним содержимым файлов. Начиная с этого раздела акцент сместится в сторону функций, которые управляют файлами как неделимыми элементами.

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

Функция проверяет, существует ли файл с именем filename, и возвращает true, если это так. Каталог поиска выбирается с помощью параметра flag: когда он равен 0 (значение по умолчанию), файл ищется в каталоге текущей копии терминала (MQL5/Files); если flag равен FILE_COMMON, проверяется общий каталог всех терминалов Users/<пользователь>...MetaQuotes/Terminal/Common/Files. Если MQL-программа выполняется в тестере, рабочий каталог расположен внутри папки агента тестирования (Tester/<агент>/MQL5/Files), см. вводную часть главы Работа с файлами.

Указанное имя может принадлежать не файлу, а каталогу. В этом случае функция FileIsExist возвратит false, а в переменную _LastError будет записана псевдо-ошибка 5018 (FILE_IS_DIRECTORY).

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

Функция удаляет файл с указанным именем filename. Параметр flag определяет местоположение файла. При значении по умолчанию удаление производится в рабочем каталоге текущего экземпляра терминала (MQL5/Files) или агента тестирования (Tester/<агент>/MQL5/Files), если программа выполняется в тестере. Если flag равен FILE_COMMON, файл должен находиться в общей папке всех терминалов (/Terminal/Common/Files).

Функция возвращает признак успешного выполнения (true) или ошибки (false).

Данная функция не позволяет удалять каталоги. Для этой цели воспользуйтесь функцией FolderDelete (см. раздел Работа с папками).

Упражнения с описанными функциями выполним в скрипте FileExist.mq5. В нем проведем несколько манипуляций с временным файлом.

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)
}

Файл изначально не существует, поэтому обе функции FileIsExist и FileDelete возвращают false, и код ошибки равен 5019 (FILE_NOT_EXIST).

Затем мы создаем файл, и функция FileIsExist сообщает о его наличии. Однако удалить его нельзя, потому что он открыт и занят нашим процессом (код ошибки 5006, CANNOT_DELETE_FILE).

После того как файл закрыт, его удается удалить.

В завершении скрипта проверке и попытке удаления подвергается каталог "MQL5Book". FileIsExist возвращает false, потому что это не файл, однако код ошибки 5018 (FILE_IS_DIRECTORY) уточняет, что это директория.