FileOpen
FileOpen
函数打开文件的指定名称和标签。
int FileOpen(
string file_name, // 文件名
int open_flags, // 标记的组合
short delimiter='\t', // 定界符
uint codepage=CP_ACP // 代码页
);参量
- file_name
[in] 文件名称包括子文件夹,如果文件为编辑开放,就会建立子文件夹。
- open_flags
[in] 标记的组合 决定文件夹的操作方式,标签如下定义 FILE_READ为阅读展开 FILE_WRITE 为编辑展开 FILE_BIN 二次编辑阅读模式(不会从字符串到字符串转换) FILE_CSV csv类型文件(所有记录项目转换成统一码字符串或者ansi类型,被定界符分开) FILE_TXT 简单文本文件(与csv相同,但不考虑定界符) FILE_ANSI ANSI类型线(单一字节交易品种) FILE_UNICODE UNICODE类型线(双精度函数字符) FILE_SHARE_READ 从各自程序中共享阅读 FILE_SHARE_WRITE 从各自程序中共享编辑 FILE_COMMON 所有客户端的共享文件夹中的文件位置 \Terminal\Common\Files.
- delimiter=’\t’
[in] 在txt或者csv文件中使用分隔符的值,如果csv文件标识符不是指定的,默认到标签,如果txt文件标识符不是制定的,就不使用分隔符。如果分隔符清晰建立成0,不使用分隔符。
- codepage=CP_ACP
[in] 代码页的值,最多使用 代码页 提供占用常量。
返回值
如果文件成功打开,函数返回文件处理,然后访问文件数据,失败后返回 INVALID_HANDLE。
注释
出于安全考虑,工作文件必须严格由MQL5语言管理。使用MQL5实 施文件操作的文件意味着,不能在文件沙箱外。
如果文件应该以特定的编码方式(指定包含代码页值的codepage参数)读取,请确保设置FILE_ANSI标识。如果没有指定的FILE_ANSI标识,则文本文件将以Unicode形式读取,而无需进行任何转换。
文件在客户端子文件 MQL5\Files (或者testing_agent_directory\MQL5\Files)中打开,如果FILE_COMMON在制定标签中,文件在所有MT5客户端的共享文件中打开。
“命名管道"可以根据以下规则打开:
- 管道名称是一个字符串,应该有以下显示:”\\servername\pipe\pipename", 这里servername - 网络中的服务器名称,而pipename是管道名称。如果管道用在同一个计算机上,服务器名称可以忽略,但有一个点应该被插入以替代它:"\\.\pipe\pipename"。尝试连接管道的客户应该知道其名称。
- FileFlush() 和 FileSeek() 在从管道读取和写入的顺序操作之间应该在文件开始被调用。
特殊符号’\‘应该用于显示字符串。因此,’\’ 应该在MQL5应用程序编写名称时,使用双杠。这意味着上面示例应该显示如下代码:"\\\\servername\\pipe\\pipename"。
使用命名管道的更多信息可以查看文章"通过MetaTrader 5沟通使用命名管道,而非DLLs"
示例:
//+------------------------------------------------------------------+
//| 启动函数的脚本程序 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 错误的打开文件方法
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("Failed to open the file by the absolute path ");
Print("Error code ",GetLastError());
}
//--- “文件沙盒效应”中正确的工作方法
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("Operation FileOpen failed, error ",GetLastError());
//---在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("The file must be created in the folder "+terminal_data_path+"\\"+subfolder);
}
else Print("File open failed, error ",GetLastError());
}