Как получить собственное имя и путь файла ex5 ? - страница 3

 

как получить размер файла ex5 ? 

string FullPath = MQLInfoString(MQL_PROGRAM_PATH);  // Получаем полный путь к файлу ex5
Print("FullPath = ", FullPath);

// Открываем файл для чтения
int file_handle = FileOpen(FullPath, FILE_READ | FILE_BIN);

if (file_handle != INVALID_HANDLE) {
    // Получаем размер файла
    ulong file_size = FileSize(file_handle);
    Print("Размер файла: ", file_size, " байт");

    // Закрываем файл
    FileClose(file_handle);
} else {
    Print("Ошибка при открытии файла.");
}

пробую так но в итоге ex5 не может быть прочитан что бы выполнить FileSize(file_handle); где  handle является FileOpen

---- Ошибка при открытии файла.

Есть альтернативы получить как то размер файла именно из пути MQL_PROGRAM_PATH? для Индикаторов и роботов ex5 не из папки MQL/FILES

 
Alex Renko #:

как получить размер файла ex5 ?

#include <WinAPI\WinAPI.mqh>

#define GENERIC_READ  0x80000000
#define SHARE_READ    1
#define OPEN_EXISTING 3

int GetFileSize( const string FileName )
{
  const HANDLE handle = kernel32::CreateFileW(FileName, GENERIC_READ, SHARE_READ, 0, OPEN_EXISTING, 0, 0);
  int Res = (handle != INVALID_HANDLE) ? 0 : -1;

  if (!Res)
  {
    Res = (int)kernel32::GetFileSize(handle, Res);
    
    kernel32::CloseHandle(handle);    
  }

  return(Res);
}

int GetMySize()
{
  return(GetFileSize(MQLInfoString(MQL_PROGRAM_PATH)));
}

void OnStart()
{
  Print(GetMySize());
}
 
fxsaber #:

Пасиб!! Я понял что придется через кернел кодить... не хотел лишние лдд юзать думал как то посредством mql можно 

ulong GetFileSizeExW(string filePath)  

//#import "Kernel32.dll"
//   int CreateFileW(ushort &fileName[], uint desiredAccess, uint shareMode, int securityAttributes, uint creationDisposition, uint flagsAndAttributes, int templateFile);
//   int GetFileSizeEx(int hFile, long &lpFileSize);
//   int CloseHandle(int hObject);
//#import

{
   ushort wFilePath[];
   StringToShortArray(filePath, wFilePath);

   // Открываем файл через Windows API (только для чтения, без блокировки)
   int hFile = CreateFileW(wFilePath, 0x80000000, 0x00000001, 0, 3, 0x80, 0);

   if (hFile == -1) // INVALID_HANDLE_VALUE
   {
      Print("Ошибка открытия файла: ", filePath);
      return 0;
   }

   // Получаем размер файла
   long fileSize = 0;
   if (!GetFileSizeEx(hFile, fileSize))
   {
      Print("Ошибка получения размера файла.");
      CloseHandle(hFile);
      return 0;
   }

   // Закрываем дескриптор файла
   CloseHandle(hFile);

   return (ulong)fileSize;
}
//-------------------------------------------------------------------------------------
 
Alex Renko #:

Пасиб!! Я понял что придется через кернел кодить... не хотел лишние лдд юзать думал как то посредством mql можно 

можно заранее сделать символьныую ссылку и читать/считать методами MQL