Как удалить или исправить файл после ошибки 5004 ? - страница 3

 

Файл опять обнулился, теперь и дома и на VPS.

Alexey Viktorov #:

FILE_READ и FILE_SHARE_READ это разные ключи. Ключ  FILE_READ всё-же нужен, чтобы не зависеть от умолчания. А ключ FILE_SHARE_READ только разрешает другим читателям этот файл использовать для чтения.

Ключ FILE_SHARE_WRITE позволит писателю перезаписать файл даже в тот момент когда файл читается…

Спасибо, кажется проясняется: то есть писателю я должен добавить FILE_SHARE_WRITE

            int handl1=FileOpen(file_cpy,FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_TXT);

А читателю надо добавить?

      int FileHandle1=FileOpen(file_cpy,FILE_READ | FILE_SHARE_READ | FILE_BIN);
 
Aleksander Gladkov #:

Файл опять обнулился, теперь и дома и на VPS.

Спасибо, кажется проясняется: то есть писателю я должен добавить FILE_SHARE_WRITE

            int handl1=FileOpen(file_cpy,FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_TXT);

А читателю надо добавить?

      int FileHandle1=FileOpen(file_cpy,FILE_READ | FILE_SHARE_READ | FILE_BIN);

не надо писателю добавлять SHARE_XXX - он использует файл инклюзивно. Пока он что-то там пишет, никто другой не должен также писать или читать. При открытии - проверить GetLastError() и если что можно разок и повторить если файл кем-то используется

читателю всегда SHARE_READ - они могут читать толпой

флаги режима FILE_TXT, FILE_BIN (и кодировок) должны совпадать у всех. Ну или вы должны очень чётко представлять что тама и предпринимать сами меры по перекодированию

 
Maxim Kuznetsov #:

не надо писателю добавлять SHARE_XXX - он использует файл инклюзивно. Пока он что-то там пишет, никто другой не должен также писать или читать. При открытии - проверить GetLastError() и если что можно разок и повторить если файл кем-то используется

читателю всегда SHARE_READ - они могут читать толпой

флаги режима FILE_TXT, FILE_BIN (и кодировок) должны совпадать у всех. Ну или вы должны очень чётко представлять что тама и предпринимать сами меры по перекодированию

Дело в том, что цитата " Ключ FILE_SHARE_WRITE позволит писателю перезаписать файл даже в тот момент когда файл читается… "

без него у меня писатель без этого ключа  int handl1=FileOpen(file_cpy,FILE_WRITE | FILE_SHARE_READ | FILE_TXT); при результате INVALID_HANDLE (возможно если кто-то читает)  обнулял файл и при повторных попытках продолжал возвращать 5004.

С эти ключом пока работает, посмотрим как дальше.

 
Aleksander Gladkov #:

Файл опять обнулился, теперь и дома и на VPS.

Спасибо, кажется проясняется: то есть писателю я должен добавить FILE_SHARE_WRITE

            int handl1=FileOpen(file_cpy,FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_TXT);

А читателю надо добавить?

      int FileHandle1=FileOpen(file_cpy,FILE_READ | FILE_SHARE_READ | FILE_BIN);

Писателю FILE_SHARE_WRITE добавлять не надо. Писателю это надо в том случае, если писатель не один. А вот когда читателей несколько, то каждый должен иметь ключ FILE_SHARE_READ 

Эти ключи используются примерно так «Я читаю, но никому не мешаю читать.» или «Я читаю, но никому не мешаю этот файл переписать или дополнить.»

У вас пропала ошибка только потому, что читатель разрешил перезаписать файл в момент чтения. То-есть не факт, что прочли его все читатели, но файл будет перезаписан. А по хорошему это вовсе не ошибка, а сообщение о занятости файла. Блокировка файла происходит только если файл открыт и не закрыт. А если читатель открыл файл, прочёл и закрыл, то после этого писатель без проблем этот файл перезапишет…

 
Alexey Viktorov #:

Писателю FILE_SHARE_WRITE добавлять не надо. Писателю это надо в том случае, если писатель не один. А вот когда читателей несколько, то каждый должен иметь ключ FILE_SHARE_READ 

Эти ключи используются примерно так «Я читаю, но никому не мешаю читать.» или «Я читаю, но никому не мешаю этот файл переписать или дополнить.»

У вас пропала ошибка только потому, что читатель разрешил перезаписать файл в момент чтения. То-есть не факт, что прочли его все читатели, но файл будет перезаписан. А по хорошему это вовсе не ошибка, а сообщение о занятости файла. Блокировка файла происходит только если файл открыт и не закрыт. А если читатель открыл файл, прочёл и закрыл, то после этого писатель без проблем этот файл перезапишет…

Ситуация сдвинулась с мертвой точки: теперь утилита пишет файл и исправляет, если был сбой и он обнулился.

Работает код:

int handl1=FileOpen(file_cpy,FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_TXT);


Осталась проблема с чтением: читатель запомнил, что была ошибка с первым файлом и, не смотря на то что он исправлен, продолжает читать копию.

У читателей код:

int FileHandle1=FileOpen(file_cpy,FILE_READ | FILE_SHARE_READ | FILE_BIN);

Надо пробовать добавить флаг FILE_SHARE_WRITE

 
Aleksander Gladkov #:

Ситуация сдвинулась с мертвой точки: теперь утилита пишет файл и исправляет, если был сбой и он обнулился.

Работает код:

int handl1=FileOpen(file_cpy,FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_TXT);


Осталась проблема с чтением: читатель запомнил, что была ошибка с первым файлом и, не смотря на то что он исправлен, продолжает читать копию.

У читателей код:

int FileHandle1=FileOpen(file_cpy,FILE_READ | FILE_SHARE_READ | FILE_BIN);

Надо пробовать добавить флаг FILE_SHARE_WRITE

А почему вы пишете текстовый файл, а читаете бинарный?

Потом, чтобы читатель не пытался читать уже прочитанный файл, запомните время прочтения, посмотрите дату создания файла и если дата создания больше даты прочтения, то читаем. Иначе курим на заборе…

Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Свойства файлов
Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Свойства файлов
  • www.mql5.com
Свойства файлов - Константы ввода/вывода - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

А почему вы пишете текстовый файл, а читаете бинарный?

Потом, чтобы читатель не пытался читать уже прочитанный файл, запомните время прочтения, посмотрите дату создания файла и если дата создания больше даты прочтения, то читаем. Иначе курим на заборе…

Иначе у меня не работает.

Дело в том, что читатель пытается прочитать исправленный файл, однако при открытии получает ошибку 5004.

Поставил флаг FILE_SHARE_WRITE на чтение.

Пока работает.

 
Alexey Viktorov #:

Это ответ на этот вопрос???


Мой алгоритм интерпретации данных работает правильно, если пишу FILE_TXT, а читаю FILE_BIN
 
Если это мт5, то не лишним будет дополнить 
Причина обращения: