Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Потоковый вывод и FileSystemWatcher


Автор: olegarh 8.9.2011, 22:53
В общем прога c++/clr использует класс http://msdn.microsoft.com/ru-ru/library/system.io.filesystemwatcher.aspx

Суть в том , что при добавлении файла в директорию программа делает какой либо вывод файл с помощью fstream.

получается так что файл открыт всегда т.к. программа отслеживает директорию постоянно 
выглядит это примерно так. не буду приводить весь код
Код

    xml.open ( "C:\\print\\print.xml" ,ios::trunc);
    xml <<"<?xml version=\"1.0\" encoding=\"WINDOWS-1251\"?><?xml-stylesheet type=\"text/xsl\" href=\"print.xsl\"?><main><print>";

    Watcher::run();


    xml <<"</print></main>";
    
    xml.close();//закрываем поток


в итоге получается что файл закрывается только тогда когда я выхожу из программы.. (после завершения класса watcher)
который соответственно постоянно отслеживает директорию... 

Т.к. файл используется программой, то когда она работает я его открыть не могу, а даже если открою то он будет незакончен (т.к. это xml, то это существенно)

Итак вопрос. Можно как то "приостанавливать" поток, что бы можно было просматривать файл пока программа в режиме ожидания. и что бы он конечно был валидным (законченым)

надеюсь я доступно объяснил)))

Автор: maydjin 8.9.2011, 23:15
http://www.cplusplus.com/reference/iostream/ostream/flush/

Автор: olegarh 8.9.2011, 23:27
Ага))

Как я понял если допустим сделать flush вот так, то весь файл будет доступен во время выполнения программы?

а что будет если поступит новый файл?

Код

    xml.open ( "C:\\print\\print.xml" ,ios::trunc);
    xml <<"<?xml version=\"1.0\" encoding=\"WINDOWS-1251\"?><?xml-stylesheet type=\"text/xsl\" href=\"print.xsl\"?><main><print>";
    Watcher::run();
    xml <<"</print></main>";
    xml.flush();//здесь
    xml.close();


Добавлено через 3 минуты и 41 секунду
скомпилировал smile 

вообще не изменилось ничего

Автор: maydjin 8.9.2011, 23:50
Как я считаю, flush() нужно вызывать перед простоем в программе а не перед закрытием файла. При этом, пока файл открытый на запись не закрыт, он скорее всего не будет доступен для открытия в каких либо режимах, кроме readonly. Не проверял как flush работает в  файловых потоках, но думаю именно так как заявленно в документации.
А то что файл на каком то этапе после одного из вызовов flush не будет валидным xml так это уже проблемма алгоритма записи, если это критично пиши сначала в какой нибудь буфер, а потом этот буфер пиши в файл.

Кстати для чего использовать FileSystemWatcher(не знаю что такое но по названию догадываюсь не заметил что в 1 топике ссылкаsmile), если у тебя есть доступ к коду который выполняет операции над файлом ?
Цитата

а что будет если поступит новый файл?

Не совсем понял о чем ты ? Да и вообще не очень понятна суть задачи.

Цитата

в итоге получается что файл закрывается только тогда когда я выхожу из программы.. (после завершения класса watcher)

В чем проблемма ? Закрывай файл в другом месте.

Да, и делать flush перед close бессмысленно по идее, т.к. close() вызывает flush().

Автор: xvr 9.9.2011, 12:21
Открывай файл, пиши в него и закрывай внутри Watcher::run(); (при каждой модификации)
Конечно придется где то накапливать уже найденные модификации и писать их в выходной xml файл заново при каждой новой модификации

Автор: olegarh 9.9.2011, 13:55
Просто изначально не подумал о такой проблеме, а теперь из-за особенностей кода не получится так просто закрыть файл в watcher , надо перестраивать структуру кода((

думал что этого можно избежать и есть какой то способ простой...
ну раз его нет. что поделаешь. будем переделывать

 smile 

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