Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоковый вывод и FileSystemWatcher 
:(
    Опции темы
olegarh
Дата 8.9.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



В общем прога c++/clr использует класс FileSystemWatcher

Суть в том , что при добавлении файла в директорию программа делает какой либо вывод файл с помощью 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, то это существенно)

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

надеюсь я доступно объяснил)))
PM MAIL   Вверх
maydjin
Дата 8.9.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



PM MAIL   Вверх
olegarh
Дата 8.9.2011, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



Ага))

Как я понял если допустим сделать 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 

вообще не изменилось ничего
PM MAIL   Вверх
maydjin
Дата 8.9.2011, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



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

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

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

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

Цитата

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

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

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

Это сообщение отредактировал(а) maydjin - 9.9.2011, 00:04
PM MAIL   Вверх
xvr
Дата 9.9.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

PM MAIL   Вверх
olegarh
Дата 9.9.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



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

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

 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.