Принцип работы FileFlush() - страница 4

 
Alexander Bereznyak:
наблюдайте внимательнее, как выше написано так и есть

Как внимательнее-то? )

Как я написал выше, вы судя по всему открываете файл проводником, а не просто наблюдаете.  Это разные вещи.

В этом случае да, отличия есть.

 

Свойства смотрю: правой кнопкой мышки - свойства. Факт в том, что есть разница с Flush() и без Flush(). 

Открытие файла и получение атрибутов файла - не одно и тоже и вообще, проводник не открывает файлы.

 

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

Он абсолютно точный и именно так работают МТ много лет.

 

Если вы следите за файлом пассивно со стороны, не открыв его в share_read режиме(как это делает Far Manager во View режиме), то не заметите изменений долгое время. Хотя изменения фактически есть и контент там есть. Просто так операционка себя ведет - не пытается уведомлять всех и вся на каждой записи куска данных в файл. И правильно делает.

 

Про потерю данных после апишного FileWrite(вызывается как раз после FileFlush) и креша вам нужно будет очень и очень стараться, чтобы смоделировать.

 
Alexander Bereznyak:
наблюдайте внимательнее, как выше написано так и есть

Стало мне любопытно, решил проверить, что там реально пишется. Добавил еще флаг в строку с открытием файла, без него данные в процессе записи не посмотреть.. Смотрел содержимое через Total Commander (клавиша просмотра содержимого файла F3).

То есть периодически на нее нажимал, потом Esc.

Да, пишутся реально строки одна за другой.

int h=FileOpen("1.txt",FILE_WRITE|FILE_ANSI|FILE_TXT|FILE_SHARE_READ);
 
Alexey Navoykov:

Как внимательнее-то? )

Как я написал выше, вы судя по всему открываете файл проводником, а не просто наблюдаете.  Это разные вещи.

В этом случае да, отличия есть.

Не нужно ничего открывать - просто в проводнике Windows 10 достаточно жать "F5" - сразу видно, что размер файла меняется (я в своём тесте добавил ещё десять записей FileWriteString - так заметнее изменение размера).
 
Karputov Vladimir:
Не нужно ничего открывать - просто в проводнике Windows 10 достаточно жать "F5" - сразу видно, что размер файла меняется (я в своём тесте добавил ещё десять записей FileWriteString - так заметнее изменение размера).
так это тоже приводит к открытию файла, насколько я понимаю, или нет?  что означает F5?
 
Alexey Volchanskiy:

Стало мне любопытно, решил проверить, что там реально пишется. Добавил еще флаг в строку с открытием файла, без него данные в процессе записи не посмотреть.. Смотрел содержимое через Total Commander (клавиша просмотра содержимого файла F3).

То есть периодически на нее нажимал, потом Esc.

Да, пишутся реально строки одна за другой.

Тут еще посты появились про открытие файла по F5. Когда я смотрел содержимое Total Commander, то естественно, попробовал закомментировать FileFlush, файл открывался, но был пустой, пока скрипт не отработал до конца и не закрыл файл с записью.

С FileFlush данные реально скидывались построчно.

Билд 1375. 

 
Alexey Volchanskiy:

Стало мне любопытно, решил проверить, что там реально пишется. Добавил еще флаг в строку с открытием файла, без него данные в процессе записи не посмотреть.. Смотрел содержимое через Total Commander (клавиша просмотра содержимого файла F3).

То есть периодически на нее нажимал, потом Esc.

Да, пишутся реально строки одна за другой.

Зато если ничего не нажимать, то размер не меняется.

Но я обнаружил любопытную закономерность. Если после FileFlush добавить строчку  FileGetInteger("MyFile.txt", FILE_SIZE), где MyFile - это естественно имя нашего файла, то размер файла в Total Commander динамически обновляется и без всякого F3

 

Вот скрипт. Во входных параметрах: если "false" - значит сброс данных в конце цикла, если "true" - значит сброс идёт поблочно.

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property script_show_inputs
//---
input bool flush=false;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int h=FileOpen("1.txt",FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1)return;
   for(int i=0;i<30;i++)
     {
      for(int j=0;j<1000;j++)
        {
         FileWriteString(h,"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");
        }
      if(flush)
         FileFlush(h);
      Sleep(2000);
     }
   FileClose(h);
   Alert(1);
  }
//+------------------------------------------------------------------+

 

Проверять количество операций записи в диспетчере задач (вкладка "Подробности"): 

Операции записи 

 

Разница сразу видна - если параметр "true" - то каждые две секунды идёт операция записи (сброс блока текста), если параметр равен "false" - то сброс идёт в конце скрипта. 

Файлы:
Test.mq5  3 kb
 
Alexey Navoykov:
так это тоже приводит к открытию файла, насколько я понимаю, или нет?  что означает F5?
Нет. файл не открывается, в Windows в проводнике указаны размеры файлов. F5 - обновить.