Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 раз в секунду дергаться, если можна один сокет создать и будет он сидеть и ждать. как только данные пришли, он тут же их и обрабатывает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)