Qt, QFile: Ничнего не понимаю.
Jul. 27th, 2007 04:14 pmЛюбимая мной программа теряет конфиг, если на диске закончилось место.
Полез разбираться...
Проблема по сути в том, что при перезаписи конфига, сим не просекает фишку, что во время записи произошла проблема, стирает старый вариант, а новый, вариант, оказывается неполным. И все... конфига нет.
Читаю код. Из кода узнаю, что в qt у объекта файл есть метод writeBlock который пишет строку в файл, и возвращает кол-во реально записанных байт.
Форматирую небольшой файлик в ext3, монтирую, проверяю на кошечке... Таки да, супер, когда место кончается, writeBlock начинает возвращать 0 когда место заканчивается...
Вставляю оною проверку в сим. (Там они анализировали не статус каждой попытки записать, а статус всего процесса целиком) На выходе имеем хрен: writeBlock уверяет, что все записывается успешно, хотя на разделе нет ни килобайта свободного места. И статус всего рпоцесса записи f.status() -- IO_Ok)
Самое забавное, что с другим конфигом (там их несколько) все проходит нормально. Оно получает статус IO_WriteError и не херит предидущую версию конфига...
В чем разница -- я не понимаю...
Все очень загадочно...
Пойду в форум Лора пожалуюсь, может кто что умное скажет...
UPDATE: Правильный ответ тут: http://shaplov.livejournal.com/302225.html
Полез разбираться...
Проблема по сути в том, что при перезаписи конфига, сим не просекает фишку, что во время записи произошла проблема, стирает старый вариант, а новый, вариант, оказывается неполным. И все... конфига нет.
Читаю код. Из кода узнаю, что в qt у объекта файл есть метод writeBlock который пишет строку в файл, и возвращает кол-во реально записанных байт.
Форматирую небольшой файлик в ext3, монтирую, проверяю на кошечке... Таки да, супер, когда место кончается, writeBlock начинает возвращать 0 когда место заканчивается...
Вставляю оною проверку в сим. (Там они анализировали не статус каждой попытки записать, а статус всего процесса целиком) На выходе имеем хрен: writeBlock уверяет, что все записывается успешно, хотя на разделе нет ни килобайта свободного места. И статус всего рпоцесса записи f.status() -- IO_Ok)
Самое забавное, что с другим конфигом (там их несколько) все проходит нормально. Оно получает статус IO_WriteError и не херит предидущую версию конфига...
В чем разница -- я не понимаю...
Все очень загадочно...
Пойду в форум Лора пожалуюсь, может кто что умное скажет...
UPDATE: Правильный ответ тут: http://shaplov.livejournal.com/302225.html
no subject
Date: 2007-07-27 01:08 pm (UTC)no subject
Date: 2007-07-27 01:11 pm (UTC)no subject
Date: 2007-07-27 01:20 pm (UTC)Я-то лично пользуюсь kopete. Очень приятная программа.
no subject
Date: 2007-07-27 01:29 pm (UTC)Каждую запись я сопровождаю тестовым выводом. Каждая запись успешная. При этом на разделе ноль свободного места.
Может у QFile какие специальные флаги стояли, кеширование там.
В документации про это ничего не сказано, кроме того в отдельной программе точно так же открытый файл ловит diskfull на ура.
Я-то лично пользуюсь kopete. Очень приятная программа.
Эта информация была особенно полезна, и позволила существенно продвинуться в вопросе изучения функционирования qt вообще и QFile в частности.
no subject
Date: 2007-07-27 01:43 pm (UTC)Кстати, где стоит тестовый вывод? В самой библиотеке QT, сразу за вызовом writeBlock в процедуре записи конфигурационного файла?
Ну, это я к тому, что лично у меня нет стимула ловить глюки sim-а. А то бы сам покопался в коде.
В итоге скорее всего причина окажется банальной и смешной. Просто глаз замылился.