| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Потоковый вывод и FileSystemWatcher |
| Автор: olegarh 8.9.2011, 22:53 | ||
| В общем прога c++/clr использует класс http://msdn.microsoft.com/ru-ru/library/system.io.filesystemwatcher.aspx Суть в том , что при добавлении файла в директорию программа делает какой либо вывод файл с помощью fstream. получается так что файл открыт всегда т.к. программа отслеживает директорию постоянно выглядит это примерно так. не буду приводить весь код
в итоге получается что файл закрывается только тогда когда я выхожу из программы.. (после завершения класса watcher) который соответственно постоянно отслеживает директорию... Т.к. файл используется программой, то когда она работает я его открыть не могу, а даже если открою то он будет незакончен (т.к. это xml, то это существенно) Итак вопрос. Можно как то "приостанавливать" поток, что бы можно было просматривать файл пока программа в режиме ожидания. и что бы он конечно был валидным (законченым) надеюсь я доступно объяснил))) |
| Автор: maydjin 8.9.2011, 23:15 |
| http://www.cplusplus.com/reference/iostream/ostream/flush/ |
| Автор: olegarh 8.9.2011, 23:27 | ||
| Ага)) Как я понял если допустим сделать flush вот так, то весь файл будет доступен во время выполнения программы? а что будет если поступит новый файл?
Добавлено через 3 минуты и 41 секунду скомпилировал вообще не изменилось ничего |
| Автор: maydjin 8.9.2011, 23:50 | ||||
| Как я считаю, flush() нужно вызывать перед простоем в программе а не перед закрытием файла. При этом, пока файл открытый на запись не закрыт, он скорее всего не будет доступен для открытия в каких либо режимах, кроме readonly. Не проверял как flush работает в файловых потоках, но думаю именно так как заявленно в документации. А то что файл на каком то этапе после одного из вызовов flush не будет валидным xml так это уже проблемма алгоритма записи, если это критично пиши сначала в какой нибудь буфер, а потом этот буфер пиши в файл. Кстати для чего использовать FileSystemWatcher(не знаю что такое но по названию догадываюсь не заметил что в 1 топике ссылка
Не совсем понял о чем ты ? Да и вообще не очень понятна суть задачи.
В чем проблемма ? Закрывай файл в другом месте. Да, и делать flush перед close бессмысленно по идее, т.к. close() вызывает flush(). |
| Автор: xvr 9.9.2011, 12:21 |
| Открывай файл, пиши в него и закрывай внутри Watcher::run(); (при каждой модификации) Конечно придется где то накапливать уже найденные модификации и писать их в выходной xml файл заново при каждой новой модификации |
| Автор: olegarh 9.9.2011, 13:55 |
| Просто изначально не подумал о такой проблеме, а теперь из-за особенностей кода не получится так просто закрыть файл в watcher , надо перестраивать структуру кода(( думал что этого можно избежать и есть какой то способ простой... ну раз его нет. что поделаешь. будем переделывать |