Скачать MetaTrader 5

Как получить дату/время созданиям файла/последнего доступа к файлу/последней записи в файл (помогите прикрутить WinAPI GetFileTime)

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
chief1973
260
chief1973  

Здравствуйте

Подскажите, пожалуйста, как получить по хендлу файла (получаем хендл через FileOpen) узнать его дату создания/последней записи/ последнего доступа?

Нужно для этого использовать WinAPI функцию. GetFileTime для этого, только у меня не получается ее правильно подключить и использовать 


BOOL GetFileTime(
  HANDLE hFile,
  LPFILETIME lpCreationTime,
  LPFILETIME lpLastAccessTime,
  LPFILETIME lpLastWriteTime
);
Комбинатор
16181
Комбинатор  

Если умеете преобразовывать структуру FILETIME в юникс время -- вот пожалуйста -- 

импорт

   bool  GetFileTime(int hFile, int& lpCreationTime[], int& lpLastAccessTime[], int& lpLastWriteTime[]);

использование

   // requesting time properties
   int creation[2], lastAccess[2], lastModify[2];
   if (GetFileTime(hFile, creation, lastAccess, lastModify))
   {
      //...
   }

Хендл hFile для этой функции должен быть создан функцией CreateFileA, а никак не нативным FileOpen.

chief1973
260
chief1973  
А можно обойтись без преобразования в UNIX время? Мне нужно просто сравнить время последнего изменения файла с предыдущим временем изменения, чтобы, если время последнего изменения больше времени предпоследнего изменения, выполнить заданные действия
o_o
Модератор
24049
o_o  
chief1973:
А можно обойтись без преобразования в UNIX время? Мне нужно просто сравнить время последнего изменения файла с предыдущим временем изменения, чтобы, если время последнего изменения больше времени предпоследнего изменения, выполнить заданные действия

ну тогда покопайте в сторону что такое FILETIME. позадавайте в него разные значения, может и поймете опытным путем как правильно их сравнивать. иначе в MSDN прямая дорога

chief1973
260
chief1973  
#import "kernel32.dll"
  bool  GetFileTime(int hFile, int& lpCreationTime[], int& lpLastAccessTime[], int& lpLastWriteTime[]);                                                                                                                                                                                                    
#import

void init() {
  handle = FileOpenFull(TerminalPath()+"\history\Alpari-Demo\iEURUSD1.hst",2);
}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int creation[2], lastAccess[2], lastModify[2];
   int array[6];
   bool filetime;
   Alert(handle);
  
   //RefreshRates();
   int hwnd=WindowHandle(Symbol(),Period());
   filetime = GetFileTime(handle, creation, lastAccess, lastModify);

   Alert("filetime: "+filetime);


Подскажите, в чем здесь ошибка? Выдает: 'GetFileTime' - function already defined and has a different parameters    E:\Terminal_Alpari\experts\scripts\Offline_Refresher.mq4 (18, 307)

Если закоментирую импорт из kernel32 (может она уже определена где-то), то пишет, что функция не определена


Если делаю так:

#import "kernel32.dll"

bool  GetFileTime(int hFile, int& lpCreationTime[6]);
#import

void init() {
  handle = FileOpenFull(TerminalPath()+"\history\Alpari-Demo\iEURUSD1.hst",2);
}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int creation[6];
   int array[6];
   bool filetime;
   Alert(handle);
  
   //RefreshRates();
   int hwnd=WindowHandle(Symbol(),Period());
   filetime = GetFileTime(handle, creation);

   Alert("filetime: "+filetime);


То вылетает:


2013.01.29 17:02:53    Offline_Refresher EURUSD,M1: function 'GetFileTime' call from dll 'kernel32.dll' critical error c0000005 at 7506E5E4.

Комбинатор
16181
Комбинатор  
Весь листинг давайте
chief1973
260
chief1973  

Все вопрос в предыдущем посте решен - нужно было убрать функцию, которая была справа и я ее не видел

Теперь другой вопрос: время последнего создания файла возвращается одно и то же

Для работы кода нужно подключить это: https://www.mql5.com/ru/code/8577 и закоментировать в файле WinKernel32.mqh строку с функцией GetFileTime

Код:

//+------------------------------------------------------------------+
//|                                            Offline_Refresher.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property show_inputs

#include <WinUser32.mqh>
#include <stdlib.mqh>
#include <WinKernel32.mqh>
#include <ZI_File_Functions_Full.mqh>

int handle;
int filetime_1;

#import "kernel32.dll"
  bool GetFileTime(int hFile, int& lpCreationTime[], int& lpLastAccessTime[], int& lpLastWriteTime[]);                                                                                                                                                                                                      
#import

void init() {
  handle = FileOpenFull(TerminalPath()+"\history\Alpari-Demo\iEURUSD1.hst",1);
}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
  
   int creation[2], lastAccess[2], lastModify[2];
   int array[6];
   bool filetime;
   Alert(handle);
  
   //while ()
   //RefreshRates();
   //int hwnd=WindowHandle(Symbol(),Period());
   filetime = GetFileTime(handle, creation, lastAccess, lastModify);
   Alert("filetime: "+lastModify[1]);
  
    
   //int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   //PostMessageA(hwnd, MT4InternalMsg, 2, 1);
   //WindowRedraw();
   //(hwnd, WM_COMMAND, 0x822C, NULL);
   //PostMessageA(hwnd, WM_COMMAND,33324, 0);
   //Alert(hwnd+" "+Symbol()+" "+Period());
   //PostMessageA(hwnd,WM_COMMAND,33324,0); // Обновляем график  
  


   return(0);
  }
//+------------------------------------------------------------------+

void deinit() {
  FileCloseFull(handle);
 

}


В    Alert("filetime: "+creation[1]);  постоянно выводится одно и то же число - почему? Время создания файла постоянно меняется, если смотреть через Свойства файла, проверял

Комбинатор
16181
Комбинатор  

Может нужно смотреть время последней модификации?

Он пересоздается или просто изменяется?


Vadim Zhunko
5226
Vadim Zhunko  
chief1973:

Код:

void init() {
  handle = FileOpenFull(TerminalPath()+"\history\Alpari-Demo\iEURUSD1.hst",1);
}

Это работает?! И ошибок не возвращает?

Может так надо:

void init()
 {
  handle = FileOpenFull(TerminalPath()+"\\history\\Alpari-Demo\\iEURUSD1.hst", 1);
 }

 

chief1973:

Для работы кода нужно подключить это: https://www.mql5.com/ru/code/8577 и закоментировать в файле WinKernel32.mqh строку с функцией GetFileTime

Зачем? Прям там бы и написал, что надо. На три строки короче.

chief1973
260
chief1973  
Zhunko:

Это работает?! И ошибок не возвращает?

Может так надо:

 

Зачем? Прям там бы и написал, что надо. На три строки короче.


Да, работает с одинарным slashem
Комбинатор
16181
Комбинатор  
Zhunko:

Это работает?!

Кстати да )


chief1973:

Да, работает с одинарным slashem
Распринтуйте путь, может таки не пашет?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий