| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Трогают ли файл? |
| Автор: szz 6.12.2007, 07:19 |
| У меня две программы обзаются, но дурацким способом - через расшаренную папку. Программа А пишет вэту папку текстовые файлы иногда, а программа Б проверяет, есть ли в этой папке файлы, и если есть - то читает их, в них комманды, которые она должна выполнить. Программа Б проверяет папку раз в 10 секунд, когда она выполняет все команды из конкретного файла - то удаляет этот файл. Проблема в том, что иногда Б начитает читать тот файл, который еще не дописан программой А! Читает, видит там пол команды написаны, и криво обрабатывает, потом еще и пытается удалить файл, который первая прога еще не дописала даже. Вот если бы Б могла видеть, не закончили ли еще писать файл с той стороны? Т.е. открыт ли где-нибудь дескриптор указывающий на этот файл? И если да, то не трогать файл, до следующей попытки. |
| Автор: JackYF 6.12.2007, 08:50 |
| szz, если не использование межпроцессное общение, то пусть программа А после окончания работы с файлом 1 создаёт вспомогательный пустой файл 1а. По нему программа Б и определит, что файл 1 готов к работе. |
| Автор: Earnest 6.12.2007, 08:55 |
| Есть флаги разделения доступа. В зависимости от OC (посмотри доки). Например, если Windows, это будут флаги FILE_SHARE_READ \ WRITE. Устанавливаются (или нет) при открытии файла. Если используется какая-то библиотека, то она может собственную интерпретацию давать. Например, MFC::CFile определяет флаги с противоположным значением: shareDenyRead и т.д. (не разрешающие, а запрещающие), но суть от этого не меняется. |
| Автор: SergeCpp 6.12.2007, 09:01 |
| http://sergecpp.mylivepage.ru/file/1/89/, работающая через общий файл Прикрепил файл с программой для Multi-Edit, которая работает совместно с CRC32 (смотрите в конце файла) Пишите в общий файл некий флаг (первый символ, например), говорящий о том, что файл готов 1. Начинаете создавать файл, флаг = 0 2. Создаёте файл, флаг не меняется 3. Файл готов, записываете флаг = 1 |
| Автор: Lazin 6.12.2007, 09:51 |
| Можно еще создать именованый мютекс, с именем, производным от имени файла, при открытии файла, перед тем как записать что-то в файл - захватывать мютекс, а потом освобождать. |
| Автор: bsa 6.12.2007, 21:11 |
| А можно еще проще. Программа Б ищет только файлы с определенным расширением и только их обрабатывает. Программа А создает файлы с другим расширением и пишет в них, как только файл полностью записан, он закрывается и его расширение меняется на правильное путем переименования. Имхо, это реализуется гораздо проще. |
| Автор: szz 6.12.2007, 22:46 |
| Всем спасибо ) нану наверное с самого простого решения - от bsa |
| Автор: nanoo 6.12.2007, 23:12 |
| а что, нельзя разве это через сокеты сделать? нафига 10 раз в секунду дергаться, если можна один сокет создать и будет он сидеть и ждать. как только данные пришли, он тут же их и обрабатывает. |