Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1547

 
Aleksandr Slavskii #:

Создал в папке  C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\MQL5\Files  файл  с таким именем File.csv

Запускаю скрипт.

Файл как и задумано копируется в папку   C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F

Всё работает.

К сожалению, ваш код у меня не сработал. 

Тогда я еще более упростил задачу: переписать файл внутри песочницы, но с новым именем:

//+------------------------------------------------------------------+
//|                                                        proba.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#import "kernel32.dll"
bool CopyFileW(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
#import
//+------------------------------------------------------------------+
void OnStart()
  {
   string File = "File.csv"; 
   string Path = TerminalInfoString(TERMINAL_DATA_PATH);
   string LastPath = Path + "\\MQL5\\Files\\" + File;
   string NewPath = Path + "\\MQL5\\Files\\" + "New_" + File;
//   string NewPath = Path + "\\" + File;
   Print("\nPath = ",Path);
   Print("LastPath = ",LastPath);
   Print("NewPath = ",NewPath);

   ResetLastError();
   bool res = kernel32::CopyFileW(LastPath, NewPath, false);
   PrintFormat("Error %d",GetLastError());                          // информация о неудачной операции
   Print("res = ",res);
  }
//+------------------------------------------------------------------+

Вот, что он распечатал:

Path = C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3

LastPath = C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Files\File.csv

NewPath = C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Files\New_File.csv

Error 0

res = false


Нового файла в папке Files не появилось.

Удивительно, что Error 0 (т.е. ошибки нет), но res = false


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


Интересно, сработает ли этот код у вас?


У меня dll разрешены.

Но все же дело, наверное, в каких-то ещё настройках?

 
klycko #:

К сожалению, ваш код у меня не сработал. 

Я не знаю чем вам помочь.

Проверил ещё раз, всё работает.

#import "kernel32.dll"
bool CopyFileW(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
#import
//+------------------------------------------------------------------+
void OnStart()// создал файл File.csv в папке Files, скрипт копирует его в папку терминала
  {
   string File = "File.csv";
   string Path = TerminalInfoString(TERMINAL_DATA_PATH);
   string LastPath = Path + "\\MQL5\\Files\\" + File;
   string NewPath = "";

   for(int i = 0; i < 3; i++)
     {
      if(i == 0)
         NewPath = Path + "\\" + File;
      else
         if(i == 1)
            NewPath = LastPath + ".txt";
         else
            NewPath = Path + "\\New" + File;

      bool res = kernel32::CopyFileW(LastPath, NewPath, false);
      Print(res);
     }
  }
//+------------------------------------------------------------------+


Как вы можете видеть копирует хоть куда и с разными именами и даже со сменой расширения. 


PS  Проверьте на наличие файла, может вы где то, что то путаете.

вставьте в начало скрипта

   if(!FileIsExist("File.csv"))
      Print("Пошёл на хе..., нет в папке такого файла!");
 
Aleksandr Slavskii #:

Я не знаю чем вам помочь.

Проверил ещё раз, всё работает.


Как вы можете видеть копирует хоть куда и с разными именами и даже со сменой расширения. 


PS  Проверьте на наличие файла, может вы где то, что то путаете.

вставьте в начало скрипта

Спасибо за юмор!

Вечером проверю

 
klycko #:

Спасибо за юмор!

Вечером проверю

Добавил ваш юмор в скрипт, и вот что оказалось:

//+------------------------------------------------------------------+
//|                                                        probb.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#import "kernel32.dll"
bool CopyFileW(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
#import
//+------------------------------------------------------------------+
void OnStart()// создал файл File.csv в папке Files, скрипт копирует его в папку терминала
  {
   string File = "File.csv";
   string Path = TerminalInfoString(TERMINAL_DATA_PATH);
   string LastPath = Path + "\\MQL5\\Files\\" + File;
   string NewPath = "";
   
   if(!FileIsExist("File.csv"))
      Print("Пошёл на хе..., нет в папке такого файла!");

   for(int i = 0; i < 3; i++)
     {
      if(i == 0)
         NewPath = Path + "\\" + File;
      else
         if(i == 1)
            NewPath = LastPath + ".txt";
         else
            NewPath = Path + "\\New" + File;

      bool res = kernel32::CopyFileW(LastPath, NewPath, false);
      Print(res);
     }
  }

Хотя в папке Files есть файл File.csv, скрипт его не видит и печатает:

Пошёл на хе..., нет в папке такого файла!

false

false

false



Просто фантастика!!!

 

	          
 
klycko #:

Просто фантастика!!!

Нет никакой фантастики. 

Сделайте в свойствах папки видимость расширения файлов.

У вас как я вижу файл имеет имя File.csv.txt,  а вы пытаетесь найти  File.csv, естественно его найти не получается.


 

Фантастика продолжается.

Взял пример скрипта из документации на FileCopy.

Дополнил его вашей проверкой на существование файла.

Результат аналогичный - скрипт файла не видит.

//+------------------------------------------------------------------+
//|                                                         prob.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpSrc="source.txt";       // источник
input string InpDst="destination.txt";  // копия
input int    InpEncodingType=FILE_ANSI; // ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   if(!FileIsExist("InpSrc",0))     // FILE_COMMON
      Print("Нет в папке такого файла!");

//--- отобразим содержимое источника (он должен существовать)
   if(!FileDisplay(InpSrc))                                      //  5004    Ошибка открытия файла
      return;
//--- проверим, существует ли уже файл копии (не обязан быть создан)
   if(!FileDisplay(InpDst))
     {
      //--- файл копии не существует, копирование без флага FILE_REWRITE (правильное копирование)
      if(FileCopy(InpSrc,0,InpDst,0))
         Print("File is copied!");
      else
         Print("File is not copied!");
     }
   else
     {
      //--- файл копии уже существует, попробуем скопировать без флага FILE_REWRITE (неправильное копирование)
      if(FileCopy(InpSrc,0,InpDst,0))
         Print("File is copied!");
      else
         Print("File is not copied!");
      //--- содержимое файла InpDst останется прежним
      FileDisplay(InpDst);
      //--- скопируем еще раз с флагом FILE_REWRITE (правильное копирование при существовании файла)
      if(FileCopy(InpSrc,0,InpDst,FILE_REWRITE))
         Print("File is copied!");
      else
         Print("File is not copied!");
     }
//--- получили копию файла InpSrc
   FileDisplay(InpDst);
  }
//+------------------------------------------------------------------+
//| Чтение содержимого файла                                         |
//+------------------------------------------------------------------+
bool FileDisplay(const string file_name)
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- откроем файл
   int file_handle=FileOpen(file_name,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      //--- отобразим в цикле содержимое файла
      Print("+---------------------+");
      PrintFormat("File name = %s",file_name);
      while(!FileIsEnding(file_handle))
         Print(FileReadString(file_handle));
      Print("+---------------------+");
      //--- закроем файл
      FileClose(file_handle);
      return(true);
     }
//--- не удалось открыть файл
   PrintFormat("%s is not opened, error = %d",file_name,GetLastError());
   return(false);
  }
//+------------------------------------------------------------------+
 

Здравствуйте, Александр.

Должна быть какая-то причина такого поведения. Надо выдвигать гипотезы и проверять их последовательно. Например:

  • Hе закралась ли русская буква ('с' или 'е') в каком-то из имён файлов? Можно взять более суровые имена типа "1.bin"
  • Тот ли это каталог данных? Проверить его открытие из меню терминала или MetaEditor
  • Считает ли скрипт именно этот каталог текущим? Добавить в начало OnStart() две команды: открыть новый файл с созданием и закрыть его. Посмотреть, что он появился в ожидаемом каталоге
Больше пока не придумал
 
klycko #:

Фантастика продолжается.

Ещё раз. Имя файла нужно указывать с расширением этого файла.

Вы создали файл с расширением .txt  и с именем  File.csv

Значит полное имя файла, которое нужно указать в программе будет таким  -   File.csv.txt

У вас в винде в свойствах папки отключено отображение расширения файлов, от этого у вас такая путаница с именами файлов.

 
Aleksandr Slavskii #:

Нет никакой фантастики. 

Сделайте в свойствах папки видимость расширения файлов.

У вас как я вижу файл имеет имя File.csv.txt,  а вы пытаетесь найти  File.csv, естественно его найти не получается.

Большое спасибо! В этом и была проблема. Без вас я не смог бы найти ошибку. Желаю вам успехов!

 

Александр, добрый день!

Оказывается, файл нужно обязательно закрывать перед его переписыванием из песочницы в папку Tester.

Иначе не работает.

Долго же я это выяснял!!!

С уважением, Александр

   string NameSettings = mnth+dy+"-"+LimPos+"-"+DoubleToString(ProfitNew,0)+".set"; // Формируется имя для Settings
   int file_handle=FileOpen("//"+NameSettings,FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);
   FileWriteString(file_handle,Settings+"\r\n");                                    // Записывается строка Settings в песочницу Files
   FileClose(file_handle);                                                          // Закрываем открытый файл, чтобы его можно было дальше перезаписывать

   if(!FileIsExist(NameSettings,0))                                                 // Проверка существования файла
      Print("Нет файла NameSettings!");
   string Path = TerminalInfoString(TERMINAL_DATA_PATH);
   string SrcPath = Path + "\\MQL5\\Files\\" + NameSettings;
   string DstPath = Path + "\\MQL5\\Profiles\\Tester\\" + NameSettings;
   ResetLastError();
   if(!kernel32::CopyFileW(SrcPath,DstPath,false))                                  // Переписываем Settings из песочницы Files в папку Tester
      PrintFormat("Error = %d",GetLastError());