Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делись ссылками на продукты и получай доход с этого
chief1973
260
chief1973 2013.01.27 19:48 

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

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

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


BOOL GetFileTime(
  HANDLE hFile,
  LPFILETIME lpCreationTime,
  LPFILETIME lpLastAccessTime,
  LPFILETIME lpLastWriteTime
);
Комбинатор
15932
Комбинатор 2013.01.27 20:07  

Если умеете преобразовывать структуру 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 2013.01.27 21:26  
А можно обойтись без преобразования в UNIX время? Мне нужно просто сравнить время последнего изменения файла с предыдущим временем изменения, чтобы, если время последнего изменения больше времени предпоследнего изменения, выполнить заданные действия
o_o
Модератор
23725
o_o 2013.01.27 23:58  
chief1973:
А можно обойтись без преобразования в UNIX время? Мне нужно просто сравнить время последнего изменения файла с предыдущим временем изменения, чтобы, если время последнего изменения больше времени предпоследнего изменения, выполнить заданные действия

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

chief1973
260
chief1973 2013.01.29 13:00  
#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.

Комбинатор
15932
Комбинатор 2013.01.29 13:22  
Весь листинг давайте
chief1973
260
chief1973 2013.01.29 13:34  

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

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

Для работы кода нужно подключить это: 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]);  постоянно выводится одно и то же число - почему? Время создания файла постоянно меняется, если смотреть через Свойства файла, проверял

Комбинатор
15932
Комбинатор 2013.01.29 13:46  

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

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


Vadim Zhunko
5226
Vadim Zhunko 2013.01.29 14:14  
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 2013.01.29 16:17  
Zhunko:

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

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

 

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


Да, работает с одинарным slashem
Комбинатор
15932
Комбинатор 2013.01.29 16:55  
Zhunko:

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

Кстати да )


chief1973:

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