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

 
Alexey Volchanskiy:
Так об этом и спрашивали. Тут ситуация такая - FileFlush ничего никуда физически не пишет, мы живем не во времена DOS )) Он дает команду Windows скинуть буфер на диск. А там уже Винда хозяйка и сама решает, когда скинуть в зависимости от занятости.
А FileClose что делает? Что-то я перестал погимать.)
 
Yuriy Asaulenko:
А FileClose что делает? Что-то я перестал погимать.)

Я не разработчик MQL, очевидно, закрывает открытый хендл файла, опять же через вызов win api CloseHandle. При этом буфера пишутся на диск автоматически. 

Просто надо понимать, что MQL не господь бог и сам физически с диском  не работает, только через посредника win api.

В Си открытие-закрытие файла через win api выглядят примерно так 

// открываем файл
HANDLE ourHandle = CreateFile(
        _T("theTest.txt"),
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ,
        default_security,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
// что-то пишем-читаем...

// и закрываем
CloseHandle(ourHandle);

 *

 
Alexey Volchanskiy:

Я не разработчик MQL, очевидно, закрывает открытый хендл файла, опять же через вызов win api CloseHandle. При этом буфера пишутся на диск автоматически. 

Просто надо понимать, что MQL не господь бог и сам физически с диском  не работает, только через посредника win api.

В Си открытие-закрытие файла через win api выглядят примерно так 

 *

Не любитель WinAPI. Только при суровой необходимости.) Уже в Си практически все было реализовано на уровне языка. h-файлы почитаешь - крыша поедет.)

Дык, по любому Винда сама решает. Мы его Клозе - дальше винда решает. Мы его Флеш - все тоже самое, опять она же.

Ну ладно. Бог с ним. 

 
Slawa, Renat. Спасибо, вроде понял.
 

По моим наблюдениям, что с FileFlush, что без него, всё работает одинаково:  данные скидываются на диск после определённого количества кб/мб, записанных по FileWrite.   Единственный способ записать данные гарантированно и сразу - это переоткрытие файла.

А все эти абсурдные аргументы про "неправильное использование" кем-то FileFlush говорят о том, что разработчики сами не воспринимают свой продукт всерьёз.  Т.е. MQL по-прежнему позиционируется не как инструмент профессионала, а как игрушка для нубов, не умеющих кодить.  И в угоду этим нубам урезается функционал и надёжность для всех остальных.   В итоге - одни ничему не учатся, а вторые вынуждены изобретать костыли.

Поддерживаю высказанную выше идею, что FileFlush тогда следует убрать из документации, либо же явно указать там, что функция - пустышка.  Зачем обманывать пользователей вот такими фразами:

Для того чтобы данные сразу же сохранились в файле, нужно использовать функцию FileFlush()

Функцию необходимо использовать тогда, когда записываемые данные представляют собой определенную ценность

 
У меня работает FileFlush(). Прямо сейчас проверил.
 
Dmitry Fedoseev:
У меня работает FileFlush(). Прямо сейчас проверил.
В чём состояла проверка?
 
Alexey Navoykov:
В чём состояла проверка?
      int h=FileOpen("1.txt",FILE_WRITE|FILE_ANSI|FILE_TXT);
      
      if(h==-1)return;
      
      for(int i=0;i<30;i++){
         FileWriteString(h,"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");
         FileFlush(h);
         Sleep(1000);
      }
      
      FileClose(h);
      
      Alert(1);

За эти 30 секунд, пока файл пишется, несколько раз посмотрел его свойства, размер увеличивался.

Потом закомментировал FileFlush(h), размер был 0, пока файл на закрылся.

 
Dmitry Fedoseev:

За эти 30 секунд, пока файл пишется, несколько раз посмотрел его свойства, размер увеличивался.

Потом закомментировал FileFlush(h), размер был 0, пока файл на закрылся.

Чудеса какие-то.  Только что у себя проверил, ничего подобного не наблюдаю.  Нулевой размер в обоих случаях.

Кстати, вы говорите, что "смотрели свойства" - имеете ввиду щёлкнуть правой кнопкой на файл и "Свойства"?  Если так, то это уже открытие файла, и тогда да, данные сразу скидываются на диск.

 
Alexey Navoykov:
Чудеса какие-то.  Только что у себя проверил, ничего подобного не наблюдаю.  Нулевой размер в обоих случаях.
наблюдайте внимательнее, как выше написано так и есть
Причина обращения: