Как можно одновременно открыть файл в двух разных программах (одна будет читать\писать), вторая только читать че написала первая?
Спасибо за ответ, но видимо я не совсем точно описал.
Первая программа открывает файл с флагами FILE_SHARE_READ и FILE_SHARE_WRITE. Вторая программа открывает файл с флагом FILE_SHARE_READ. Я понимаю, что если одна программа открыла файл для чтения/записи, то вторая может открыть этот файл только для чтния.
Но тем не менее ошибка. Файл не может быть окрытым двумя разными программами одновременно (по крайней мере у меня пока не получается).
Спасибо за ответ, но видимо я не совсем точно описал.
Первая программа открывает файл с флагами FILE_SHARE_READ и FILE_SHARE_WRITE. Вторая программа открывает файл с флагом FILE_SHARE_READ. Я понимаю, что если одна программа открыла файл для чтения/записи, то вторая может открыть этот файл только для чтния.
Но тем не менее ошибка. Файл не может быть окрытым двумя разными программами одновременно (по крайней мере у меня пока не получается).
Вы все правильно описали первый раз. Это я первый раз ответил неправильно. Хотел написать "с флагами FILE_SHARE_WRITE | FILE_SHARE_READ" , а написал черти что.
Совместный доступ к файлу получается следующим образом:
"Пишушая" программа:
#define FILE_NAME "TestFile.bin" int g_handle = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { g_handle = FileOpen(FILE_NAME, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_WRITE | FILE_READ | FILE_BIN); if (g_handle < 0) return INIT_FAILED; FileWriteDouble(g_handle, 345346.14349876); FileFlush(g_handle); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { FileClose(g_handle); }
"Читающая" программа:
#define FILE_NAME "TestFile.bin" int g_handle = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { g_handle = FileOpen(FILE_NAME, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_READ | FILE_BIN); if (g_handle < 0) { Alert("Ошибка открытия файла ", GetLastError()); return INIT_FAILED; } double value = FileReadDouble(g_handle); FileClose(g_handle); Alert("Прочитано число: ", DoubleToString(value)); return(INIT_SUCCEEDED); }
Порядок действий:
1. К одному графику подключается "пишущая" программа.
2. К другому графику подключается "читающая" программа.
Результат:
Спасибо еще раз. Всё получилось.
...
Как быть?
Как можно одновременно открыть файл в двух разных программах (одна будет читать\писать), вторая только читать че написала первая?
Заранее спасибо.
По очереди. Сначала одна открыла, записала, закрыла. Потом другая открыла, прочитала, закрыла.
А как вы представляете одновременно писать и читать? Прежде чем читать, надо полностью записать.
Добрый день.
Господа, вопрос, если кто конечно поможет.
Решил разобраться в mql5 функциями записи в файл и чтения из файла.
Ну и вобщем вроде как в документации написано, что есть флаги открытия файла такие как FILE_SHARE_READ и FILE_SHARE_WRITE которые указывают что файл будет иметь совместный доступ по записи со стороны нескольких программ.
Но на самом деле так не получается. Т.е. если файл открыт на запись в одной программе (индикаторе) (с указанием вышеописанных флагов), то он не откроется в другой программе (индикаторе) до тех пор пока в первой этот самый файл не будет закрыт (выдаёт ошибку 5004).
Как быть?
Как можно одновременно открыть файл в двух разных программах (одна будет читать\писать), вторая только читать че написала первая?
Заранее спасибо.
рецепт прост и горек :-)
флаги FILE_SHARE_READ FILE_SHARE_WRITE лучше не использовать и на них не полагаться. То есть можно, но надо сильно-сильно упереться :-) Всё равно находится нечто использующее inclusive lock - тот же OO нагло блокирует доступ к открытому им файлу
лечение: Если индиктор не может сбросить данные в оговоренный файл, то он должен осуществить сброс в *.tmp (то есть писать во временный файл) и как подвернётся возможность переписать основной.
а как сделать что в файл писались тиковые котировки например по GBPUSD ?
При помощи файловых операций. Один из подходов, как я понимаю, Вы уже видели в моем сборщике тиков. Но этот подход не является каким-либо стандартом. Так было удобно сделать мне. Другой программист, наверное, сделает несколько иначе.
Как из тиковых котировок получаем минутные графики с хаем/лоу/открытием и закрытием/volume?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день.
Господа, вопрос, если кто конечно поможет.
Решил разобраться в mql5 функциями записи в файл и чтения из файла.
Ну и вобщем вроде как в документации написано, что есть флаги открытия файла такие как FILE_SHARE_READ и FILE_SHARE_WRITE которые указывают что файл будет иметь совместный доступ по записи со стороны нескольких программ.
Но на самом деле так не получается. Т.е. если файл открыт на запись в одной программе (индикаторе) (с указанием вышеописанных флагов), то он не откроется в другой программе (индикаторе) до тех пор пока в первой этот самый файл не будет закрыт (выдаёт ошибку 5004).
Как быть?
Как можно одновременно открыть файл в двух разных программах (одна будет читать\писать), вторая только читать че написала первая?
Заранее спасибо.