FileOpen

La fonction ouvre le fichier avec le nom et les flags spécifiés.

int  FileOpen(
   string  file_name,           // Nom du fichier
   int     open_flags,          // Combinaison de flags
   short   delimiter='\t',      // Délimiteur
   uint    codepage=CP_ACP      // Page de code
   );

Paramètres

file_name

[in]  Le nom du fichier, peut contenir des sous-dossiers. Si le fichier est ouvert en écriture, ces sous-dossiers seront créés s'ils n'existent pas.

open_flags

[in] combinaison de flags déterminant le mode d'utilisation du fichier. Les flags sont définis comme suit :
FILE_READ le fichier est ouvert en lecture
FILE_WRITE le fichier est ouvert en écriture
FILE_BIN lecture-écriture en mode binaire (aucune conversion depuis et vers une chaîne de caractères)
FILE_CSV fichier de type csv (touts les élements sont convertis en chaînes de caractères de type unicode ou ansi, et sont séparés par un délimiteur)
FILE_TXT un fichier texte simple (le même que csv, mais le délimiteur n'est pas pris en compte)
FILE_ANSI lignes de type ANSI (symboles sur seul octet)
FILE_UNICODE lignes de type UNICODE (caractères sur 2 octets)
FILE_SHARE_READ lecture partagée sur plusieurs programmes
FILE_SHARE_WRITE écriture partagée sur plusieurs programmes
FILE_COMMON localisation du fichier dans un répertoire partagé pour tous les terminaux clients \Terminal\Common\Files

delimiter='\t'

[in]  valeur à utiliser comme séparateur pour les fichiers txt et csv. Si le délimiteur n'est pas spécifié pour le fichier csv, la valeur par défaut est une tabulation. Si le délimiteur n'est pas spécifié pour le fichier txt, aucun séparateur n'est utilisé. Si le séparateur est mis à 0, aucun séparateur n'est utilisé.

codepage=CP_ACP

[in]  La valeur de la page de code. Pour les pages de code les plus utilisées, il existe des constantes correspondantes.

Valeur de Retour

Si un fichier a été ouvert avec succès, la fonction retourne un handle sur le fichier, qui est ensuite utilisé pour accéder aux données du fichier. En cas d'échec, retourne INVALID_HANDLE.

Note

Pour des raisons de sécurité, travailler avec les fichiers est contrôlé de façon stricte dans le langage MQL5. Les fichiers utilisés par des opérations MQL5 ne peuvent pas être en dehors du sandbox des fichiers.

Assurez-vous de spécifier le flag FILE_ANSI si le fichier doit être lu avec un encodage spécifique (le paramètre codepage avec une page de code est spécifié). Si le flag FILE_ANSI n'est pas utilisé, le fichier texte est lu en Unicode sans conversion.

Le fichier est ouvert depuis le dossier du terminal client dans le sous-dossier MQL5\files (ou testing_agent_directory\MQL5\files en cas de test). Si FILE_COMMON est spécifié dans les flags, le fichier est ouvert dans un répertoire partagé entre tous les terminaux clients MetaTrader 5.

Les "Pipes nommés" peuvent être ouverts suivant les règles suivantes :

  • Le nom d'un pipe est une chaîne de caractères au format : "\\servername\pipe\pipename", où servername - le nom du serveur sur le réseau, et pipename est le nom d'un pipe. Si les pipes sont utilisés sur le même ordinateur, le nom du serveur peut être omis, mais un point doit être inséré à sa place : "\\.\pipe\pipename". Un client qui essaye de connecter un pipe doit connaître son nom.
  • FileFlush() et FileSeek() doivent être appelés au début du fichier entre les opérations séquentielles de lecture depuis le pipe et l'écriture dans celui-ci.

Le symbole spécial '\' est utilisé dans les chaînes de caractères affichées. Donc, '\' doit être doublé pour écrire un nom dans une application MQL5. Cela signifie que l'exemple ci-dessus doit ressembler dans le code à : "\\\\servername\\pipe\\pipename".

Plus d'informations sur l'utilisation des pipes nommés sont disponibles dans l'article "Communicating With MetaTrader 5 Using Named Pipes Without Using DLLs".

Exemple :

//+------------------------------------------------------------------+
//| Fonction de démarrage du programme                               |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Méthode incorrecte d'ouverture de fichier
   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("Echec de l'ouverture du fichier avec un chemin absolu ");
      Print("Code d'erreur ",GetLastError());
     }
 
//--- Façon correcte de travailler dans le 'sandbox des fichiers'
   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("Echec de l'opération FileOpen, erreur ",GetLastError());
//--- un autre exemple de création d'un répertoire dans 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("Le fichier doit être créé dans le dossier "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Echec d'ouverture du fichier, erreur ",GetLastError());
  }

Voir aussi

Utilisation d'une page de code, FileFindFirst, FolderCreate, Flags d'ouverture d'un fichier