跳至内容

FileOpen

FileOpen

该函数以指定的名称和标志打开文件。

int  FileOpen(
   string  file_name,           // File name
   int     open_flags,          // Combination of flags
   short   delimiter=';',       // Delimiter
   uint    codepage=CP_ACP      // Code page
   );

参数

file_name

[in] 文件名称可以包含子文件夹。如果文件被设置为写入模式,则如果没有子文件夹,系统将创建这些子文件夹。

open_flags

[in] 标志组合,用于确定文件的操作模式。标志定义如下: FILE_READ 文件以读取模式打开 FILE_WRITE 文件以写入模式打开 FILE_BIN 二进制读写模式(不进行字符串到字符串的转换) FILE_CSV csv类型文件(所有记录项都转换为unicode或ansi类型的字符串,并用分隔符分隔) FILE_TXT 简单文本文件(与csv相同,但不考虑分隔符) FILE_ANSI ANSI类型的行(单字节符号) FILE_UNICODE UNICODE类型的行(双字节字符) FILE_SHARE_READ 多个程序共享的读取权限 FILE_SHARE_WRITE 多个程序共享的写入权限 FILE_COMMON 文件在共享文件夹中的位置,供所有客户端终端使用 \Terminal\Common\Files

delimiter=’;’

[in] 在txt或csv文件中用作分隔符的值。如果未指定csv文件的分隔符,则默认分隔符为“;”。如果未指定txt文件的分隔符,则不使用分隔符。如果明确设置为0,则不使用分隔符。

codepage=CP_ACP

[in] 可选参数。代码页的值。对于最常用的代码页,提供相应的常量。

返回值

如果文件成功打开,函数将返回文件句柄,该句柄可用于访问文件数据。如果失败,则返回INVALID_HANDLE.

注意

出于安全原因,MQL4语言中文件的操作受到严格控制。使用MQL4进行文件操作的文件不能位于文件沙箱之外。

文件在客户端终端的MQL4\files子文件夹中打开(测试时则在Tester\Files中)。如果指定了FILE_COMMON作为标志,则文件将在所有MetaTrader 4客户端终端的共享文件夹中打开。

“命名管道”可以根据以下规则打开:

  • 管道名称是一个字符串,格式应为:“\\servername\pipe\pipename”,其中servername是网络中的服务器名称,pipename是管道名称。如果管道在同一台计算机上使用,可以省略服务器名称,但应插入一个点代替:\\.\pipe\pipename”。尝试连接管道的客户端应知道其名称。
  • FileFlush()FileSeek()应在从管道读取到写入的连续操作之间调用到文件的开始位置。

所示字符串中使用了特殊符号‘\’。因此,在MQL4应用程序中写入名称时,应双写‘\’。这意味着上述示例在代码中应如下所示:\\\\\servername\\pipe\\pipename”。

有关命名管道操作的更多信息,请参阅文章“使用命名管道与MetaTrader 5通信而不使用DLLs”。

示例:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- incorrect file opening method
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL4\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Failed to open the file by the absolute path ");
      Print("Error code ",GetLastError());
     }
//--- correct way of working in the "file sandbox"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(ENUM_TIMEFRAMES(_Period)));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Operation FileOpen failed, error ",GetLastError());
//--- another example with the creation of an enclosed directory in MQL4\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
      if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(ENUM_TIMEFRAMES(_Period)));
      FileClose(filehandle);
      Print("The file most be created in the folder "+terminal_data_path+"\\"+subfolder);
     }
   else Print("File open failed, error ",GetLastError());
  }

另请参阅

代码页的使用FileFindFirst()FolderCreate()文件打开标志

最后更新于