Как из советника читать файл на "C:\log.txt" ?

 

Подскажите пожалуйста простое решение?

Пробовал функции ReadFile.

//+------------------------------------------------------------------+
//|   прочитать файл и вернуть строку с содержимым                   |
//+------------------------------------------------------------------+
string ReadFile (string path) 
  {
    int handle=_lopen (path,OF_READ);           
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    int result=_llseek (handle,0,0);      
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    string buffer="";
    string char1="x";
    int count=0;
    result=_lread (handle,char1,1);
    while(result>0) 
      {
        buffer=buffer+char1;
        char1="x";
        count++;
        result=_lread (handle,char1,1);
     }
    result=_lclose (handle);              
    if(result<0)  
      Print("Ошибка закрытия файла ",path);
    return (buffer);
  }
 

 Функция хорошо бы подошла, но что в ней исправить чтобы работала?

 

//+------------------------------------------------------------------+
//|   прочитать файл и вернуть строку с содержимым                   |
//+------------------------------------------------------------------+
string ReadFile (string path) 
  {
    int handle=_lopen (path,OF_READ);
    int read_size = 50;           
    string char50="x                                                 ";

    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    int result=_llseek (handle,0,0);      
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    string buffer="";
    int count=0;
    int last=0;
    
    result=_lread (handle,char50,read_size);
    while(result>0 && result == read_size) 
      {
        buffer=buffer + char50;
        count++;
        result=_lread (handle,char50,read_size);
        last = result;
     }
    Print("Последний прочитанный блок имеет размер в байтах:", last);
    char50 = StringSubstr(char50,0,last);
    buffer = buffer + char50;    
    result=_lclose (handle);              
    if(result<0)  
      Print("Ошибка закрытия файла ",path);
    return (buffer);
  }
 

Не работает.

 

Смотрел библиотеку: https://www.mql5.com/ru/code/8577
Громоздко, не разобрался. 

 
AM2:

Подскажите пожалуйста простое решение?

Запустить терминал с ключем portable, а файл поместить в папку ...\MetaTrader 4\MQL4\Files

И не нужны ни какие библиотеки. 

 
Mislaid:

Запустить терминал с ключем portable, а файл поместить в папку ...\MetaTrader 4\MQL4\Files

И не нужны ни какие библиотеки. 

Мне это нужно для непрерывного обмена данными между самописным приложением и МТ4. Прога пишет в любую другую папку а в терминальную нет. Если быть точнее, секунд через 5-10 вылетает ошибка и запись прекращается.

Сейчас пробую такой вариант:

#define OF_EXIST  0x00004000 // Открывает файл затем закрывает это. Используйте это, чтобы тестироваться для существования файла.

#import "kernel32.dll"
   int OpenFile(string lpFileName,int lpReOpenBuff,int wStyle);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int h=0;
   h=OpenFile("C:\\log.txt",0,OF_EXIST);
   Print("Handle: ",h);
  }

 

Но выдает ошибку:      2015.09.05 06:56:19.558   Access violation read to 0x00000000 in 'kernel32.dll'


 
AM2:

Следующее решение точно сработает (сам давно этим пользуюсь), но необходимо потратить немного времени чтобы разобраться.
Погуглите "link shell extension". На этом форуме так же давались описания, поищите.
По большому счету создаете папку где угодно на диске (например в C:\XYZ), а затем - жесткий(е) линк(и) к ней из любой другой папки (например из папки 'Files' MT4). После этого любой файл помещенный в эту папку будет доступен как в оригинальной папке, так и в ее линках, как если бы это была оригинальная папка.
 
AM2:

Мне это нужно для непрерывного обмена данными между самописным приложением и МТ4. Прога пишет в любую другую папку а в терминальную нет. Если быть точнее, секунд через 5-10 вылетает ошибка и запись прекращается.

Сейчас пробую такой вариант:

 

Но выдает ошибку:      2015.09.05 06:56:19.558   Access violation read to 0x00000000 in 'kernel32.dll'


Второй аргумент функции OpenFile не может быть нулём.

Нужно делать так:

#define OF_EXIST   0x00004000
#define OFS_MAXPATHNAME 128

struct OFSTRUCT
{
  uchar cBytes;
  uchar fFixedDisk;
  ushort nErrCode;
  ushort Reserved1;
  ushort Reserved2;
  uchar szPathName[OFS_MAXPATHNAME];
};

#import "kernel32.dll"
   int OpenFile( string lpFileName, OFSTRUCT& lpReOpenBuff, int wStyle );
#import

void OnStart()
{
   int h = 0;
   OFSTRUCT ofstruct;
   h = OpenFile( "C:\\log.txt", ofstruct, OF_EXIST );
   Print( "Handle: ", h );
}
 
AM2:

Подскажите пожалуйста простое решение?


Создайте символическую ссылку на log.txt в "песочнице" терминала и всё будет работать.
 
Благодарен всем за помощь. Сейчас смотрю симлинки, также будет интересно и с win api продолжить.
 
TarasBY:
Создайте символическую ссылку на log.txt в "песочнице" терминала и всё будет работать.
Поясните, пожалуйста, как создать символическую ссылку на файл в "песочнице" терминала
 
Ko1dun:

Нужно делать так:

   int h = 0;
   OFSTRUCT ofstruct;
   h = OpenFile( "C:\\log.txt", ofstruct, OF_EXIST );
   Print( "Handle: ", h );
Print выдает -1, что ИМХО, является признаком ошибки...
 
LRA:
Поясните, пожалуйста, как создать символическую ссылку на файл в "песочнице" терминала
Вы погуглили "link shell extension"? После инсталляции в контекстном меню проводника появятся новые пункты. Кликаете правой клавишей на C:\log.txt и выбираете "Запомнить источник ссылки". Затем на папке терминала (файловой "песочнице") - у инсталлированного терминала она в одном месте, у portable в другом - разберётесь сами, опять кликаете правой клавишей и выбираете "Поместить как" -> "Символическую ссылку". Ссылка создана, терминал будет обращаться к ссылке, как к файлу.
 
TarasBY:
Вы погуглили "link shell extension"? После инсталляции ...

Инсталлировать все подряд отучился еще 50 лет назад.

Для одного файла ссылка создается так:

mklink  "X:\ПапкаТерминала\MQL4\Files\A.txt" "Y:\Фильмы\A.txt"

и в папке ...MQL4\Files\ появился файл A.txt

Для папки команда с ключом /D:

mklink /D "X:\ПапкаТерминала\MQL4\Files\BIRD\" "Y:\ICO\"

и в папке ...MQL4\Files\ появилась папка BIRD, а в ней - все содержимое папки Y:\ICO\

Подробнее: http://tigors.net/windows-on-ssd-tweaks/  и  http://kaktusenok.blogspot.ru/2012/05/hardlink-windows-7.html
Причина обращения: