Удаление файлов записанных через kernel32.dll

 

Столкнулся со следующей проблемой:

Скрипт в МТ4 скачивает из интернета файл советника и файлы индикаторов. Через библиотеку kernel32.dll эти файлы записываются в дериктории к экспертам и к индикаторам.

Файлы в директории записаны.

Чтоб МТ4 увидел эти файлы, его надо перезагрузить.

При повторном запуске программы, файлы самостоятельно удаляются.

В чем может быть проблема?

 
Видимо в том, что хендлы надо за собой закрывать.
 

2 причина - покажите код.


может он в начале удаляет существующие файлы?


я просто код копировал с форума - давно еще. Так тоже долго думал че он файл удаляет. а там была строчка l......че-то там.

 
Vladon:

2 причина - покажите код.


может он в начале удаляет существующие файлы?


я просто код копировал с форума - давно еще. Так тоже долго думал че он файл удаляет. а там была строчка l......че-то там.


Коды не буду вставлять, там 300 строк, попробуй разберись.

Хэндлы все закрываю.

после выключения программы файлы находятся в папке.

После запуска МТ4, файлы пропадают. В этом полтергейс)

 

300 строк :-) большой код. лучше не выставляй, а то головы сломаем.


Это была шутка.


А если серьезно, то без кода мы конечно можем шаманить - угадывать что ж там такое, но Увы, не все, не всегда и не всё....

 

Нашел на форуме кусок кода. То что нужно. Практически моя ситуация.

Скрипт копирует и переименовывает файл.

Когд взят от сюда - https://www.mql5.com/ru/forum/100587

// File Read Write.mq4
// Скрипт. Положить в папку experts\scripts
 
#property copyright "mandorr@gmail.com"
#include <WinUser32.mqh>
#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, int& buffer[], int bytes);
   int _lwrite (int handle, string buffer, int bytes);
   int _lclose (int handle);
#import
 
void start() 
  {
    string text=ReadFile("C:\sc1.ex4");
    WriteFile("C:\sc2.ex4",text);
    int count=StringLen(text);
    string title="Чтение из файла";
    string msg="Число считанных байт: "+count+"    \n"
    +"Cодержимое файла:\n\n"+text;
    MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
  }
 
string ReadFile (string path) 
  {
    int buffer[], count, handle, i, result;
    string text="";
    handle=_lopen  (path,0);              
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    count =_llseek (handle,0,2);          
    if(count<0)  
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    ArrayResize(buffer,1+count/4);
    result=_llseek (handle,0,0);          
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    result=_lread  (handle,buffer,count); 
    if(result<0) 
      {
        Print("Ошибка чтения файла "  ,path); 
        return ("");
      }
    result=_lclose (handle);              
    if(result<0) 
      {
        Print("Ошибка закрытия файла ",path); 
        return  ("");
      }
    for(i=0; i<ArraySize(buffer); i++) 
      {
        text=text
             +CharToStr(buffer[i]     & 0x000000FF)
             +CharToStr(buffer[i]>> 8 & 0x000000FF)
             +CharToStr(buffer[i]>>16 & 0x000000FF)
             +CharToStr(buffer[i]>>24 & 0x000000FF);
      }
    text=StringSubstr(text,0,count);
    return (text);
  }
 
void WriteFile (string path, string buffer) 
  {
    int handle, result, count=StringLen (buffer); 
    handle=_lopen (path,1);
    if(handle<0) 
      {
        handle=_lcreat (path,0);
        if(handle<0) 
          {
            Print ("Ошибка создания файла ",path);
            return;
          }
        result=_lclose (handle);
      }
    handle=_lopen  (path,1);              
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return;
      }
    result=_llseek (handle,0,0);          
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return;
      }
    result=_lwrite (handle,buffer,count); 
    if(result<0) 
      {
        Print("Ошибка записи в файл " ,path," ",count," байт");
      }
    result=_lclose (handle);              
    if(result<0)  
      {
        Print ("Ошибка закрытия файла ",path);
      }
  }
 
// End

Исходный файл (который копируется) Это скрипт - Hellow World . расширение ex4

в блокноте выглядит вот так.

Результирующий файл ( тот которые был скопирован скриптом) в блокноте выглядит вот так

Скрипт почему-то вместо пробелов вставляет какие то прямоугольники.

Из-за чего такое может быть?

 

он копирует не исходный файл а файл компилированный, т.е. ex4. Такое и будет.


C:\sc1.ex4
 
Vladon:

он копирует не исходный файл а файл компилированный, т.е. ex4. Такое и будет.


Файл C:\sc1.ex4 копируется в строку, потом эта строка записывается в файл C:\sc2.ex4. Но при открытии файлов в блокноте выглядят они по разному.

А какая скрипту разница какой файл вообще копировать? исходный, откомпилированный, мп3 или что нибудь еще. Задача: тупо по байтам скопировать.

 
Как выполняется скачивание из инета? Наверно по протоколу http.
 
Integer:
Как выполняется скачивание из инета? Наверно по протоколу http.


Естественно через http:

проблемма не в http, проблема в том что файл меняет размер после скачивания. А символы "пробелы" заменяются на какие то квадратики. (аналогиная ситуация при копирование файла в пределах диска С

 
Закачивается правильно, копируется неправильно? Попробуйте CopyFile() из kernel32.
Причина обращения: