无法在 Ubuntu 打开文件
Cannot open file on Ubuntu
我正在使用 Ubuntu 14 并尝试创建一个脚本来写入文件,但我每次都收到 5004
错误我尝试打开一个文件。
datetime currtime;
bool newcandle;
string terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
string filename = terminal_data_path + "\MQL4\Files\" + "data.csv";
int filehandle;
filehandle = FileOpen( filename, FILE_WRITE | FILE_CSV );
if ( filehandle < 0 ){
Print( "Failed to open the file by the absolute path " );
Print( "Error code ", GetLastError() );
}
else {
Print( "file opened with sucess" );
}
如何在 Ubuntu 上解决这个问题?
更新
我尝试将文件更改为以下内容:
string terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
string filename = terminal_data_path + "\tester\files\data.csv";
也就是为了这个
string filename = "\tester\files\data.csv";
为此
string filename = "\files\data.csv";
但我仍然遇到错误,但这次是 5002
而不是 5004
.
MQL4 权限设计不允许/限制文件 IO
There are three directories (with subdirectories) where working files can be placed:
/HISTORY/<current broker>
- 特别是 FileOpenHistory()
函数;
/EXPERTS/FILES
- 常见情况;
/TESTER/FILES
- 特别是用于测试(在策略测试器操作期间参考)。
Working with files from other directories is prohibited.
解决方案
调整您的 MQL4 代码以满足这一事实并尊重预构建 762 和 post-构建 762 差异("new"-MQL4 文件本地化)。
更新
作为 posted,您的 MQL4 代码(无论您是否共享它的更新状态)应该更好地处理异常。遇到过几个带有文件名的令人惊讶的人工制品。某些平台特定,在 wXP 中不会造成伤害,但无法在 VPS 托管的 wServer2008 VM 或 LinuxVM 封装的 Wine/MT4 实例上运行(相同的代码)。
仔细阅读 MQL4 帮助文档并创建一些 post-mortem 工具以进一步推进。
5002
ERR_FILE_WRONG_FILENAME
Wrong file name -------> pre-test + "fuse" the corner cases
5003
ERR_FILE_TOO_LONG_FILENAME
Too long file name
5004 <------ a good sign, we are on the safer side here
ERR_FILE_CANNOT_OPEN
Cannot open file
//-------------------------------------------------------------
// MT4_GUI_postMortem
//-------------------------------------------------------------
void MT4_GUI_postMortem( string aFileNAME = "caller forgot to pass aFileNAME"
){
// SYNTAX
// if ( aFileHANDLE == INVALID_HANDLE ) MT4_GUI_postMortem( filename );
//
int aLastErrorNUM = GetLastError();
Comment( "POST-MORTEM >>> [", aFileNAME, "] Threw error ", aLastErrorNUM );
Print( "POST-MORTEM >>> [", aFileNAME, "] Threw error ", aLastErrorNUM );
return;
}
我正在使用 Ubuntu 14 并尝试创建一个脚本来写入文件,但我每次都收到 5004
错误我尝试打开一个文件。
datetime currtime;
bool newcandle;
string terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
string filename = terminal_data_path + "\MQL4\Files\" + "data.csv";
int filehandle;
filehandle = FileOpen( filename, FILE_WRITE | FILE_CSV );
if ( filehandle < 0 ){
Print( "Failed to open the file by the absolute path " );
Print( "Error code ", GetLastError() );
}
else {
Print( "file opened with sucess" );
}
如何在 Ubuntu 上解决这个问题?
更新
我尝试将文件更改为以下内容:
string terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
string filename = terminal_data_path + "\tester\files\data.csv";
也就是为了这个
string filename = "\tester\files\data.csv";
为此
string filename = "\files\data.csv";
但我仍然遇到错误,但这次是 5002
而不是 5004
.
MQL4 权限设计不允许/限制文件 IO
There are three directories (with subdirectories) where working files can be placed:
/HISTORY/<current broker>
- 特别是 FileOpenHistory()
函数;
/EXPERTS/FILES
- 常见情况;
/TESTER/FILES
- 特别是用于测试(在策略测试器操作期间参考)。
Working with files from other directories is prohibited.
解决方案
调整您的 MQL4 代码以满足这一事实并尊重预构建 762 和 post-构建 762 差异("new"-MQL4 文件本地化)。
更新
作为 posted,您的 MQL4 代码(无论您是否共享它的更新状态)应该更好地处理异常。遇到过几个带有文件名的令人惊讶的人工制品。某些平台特定,在 wXP 中不会造成伤害,但无法在 VPS 托管的 wServer2008 VM 或 LinuxVM 封装的 Wine/MT4 实例上运行(相同的代码)。
仔细阅读 MQL4 帮助文档并创建一些 post-mortem 工具以进一步推进。
5002
ERR_FILE_WRONG_FILENAME
Wrong file name -------> pre-test + "fuse" the corner cases
5003
ERR_FILE_TOO_LONG_FILENAME
Too long file name
5004 <------ a good sign, we are on the safer side here
ERR_FILE_CANNOT_OPEN
Cannot open file
//-------------------------------------------------------------
// MT4_GUI_postMortem
//-------------------------------------------------------------
void MT4_GUI_postMortem( string aFileNAME = "caller forgot to pass aFileNAME"
){
// SYNTAX
// if ( aFileHANDLE == INVALID_HANDLE ) MT4_GUI_postMortem( filename );
//
int aLastErrorNUM = GetLastError();
Comment( "POST-MORTEM >>> [", aFileNAME, "] Threw error ", aLastErrorNUM );
Print( "POST-MORTEM >>> [", aFileNAME, "] Threw error ", aLastErrorNUM );
return;
}