crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> GIO: Как открыть файл для изменения?, Именно для изменения.
sabu
  опции профиля:
сообщение 25.5.2009, 18:52
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 25.5.2009
Пользователь №: 775

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нужно получить объект GOutputStream, дабы изменить определённые части существующего файла, но нужной функции для открытия файла я не нашол. Есть g_file_create, но она только создаёт файл и на существующий ругается; есть g_file_replace, но она полностью стирает файл; и есть g_file_append_to, но она не позволяет писать не в конец файла.

Проще конечно использовать fopen и fwrite, но раз уж я использую GTK+ и GLib, то хотелось бы использовать их методы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 25.5.2009, 20:50
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3293
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Вот что написано в описании GFileOutputStream (класс производный от GOutputStream):
Цитата
GFileOutputStream implements GSeekable, which allows the output stream to jump to arbitrary positions in the file and to truncate the file, provided the filesystem of the file supports these operations. In addition to the generic g_seekable_ API, GFileOutputStream has its own API for seeking and positioning. To find the position of a file output stream, use g_file_output_stream_tell(). To find out if a file output stream supports seeking, use g_file_output_stream_can_seek(). To position a file output stream, use g_file_output_stream_seek(). To find out if a file output stream supports truncating, use g_file_output_stream_can_truncate(). To truncate a file output stream, use g_file_output_stream_truncate().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sabu
  опции профиля:
сообщение 25.5.2009, 22:21
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 25.5.2009
Пользователь №: 775

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 25.5.2009, 21:50) *
Вот что написано в описании GFileOutputStream (класс производный от GOutputStream):
Цитата
GFileOutputStream implements GSeekable, which allows the output stream to jump to arbitrary positions in the file and to truncate the file, provided the filesystem of the file supports these operations. In addition to the generic g_seekable_ API, GFileOutputStream has its own API for seeking and positioning. To find the position of a file output stream, use g_file_output_stream_tell(). To find out if a file output stream supports seeking, use g_file_output_stream_can_seek(). To position a file output stream, use g_file_output_stream_seek(). To find out if a file output stream supports truncating, use g_file_output_stream_can_truncate(). To truncate a file output stream, use g_file_output_stream_truncate().



Функции перечисленные в конце цитаты уже не существуют, похоже разработчики забыли убрать их из документации, ну да Бог с ними ведь есть интерфейс GSeekable, но толку от него нет.

Поглядев в исходники:
g_file_append_to() открывает файл с параметром O_APPEND, что не даёт использовать g_seekable_seek().
g_file_replace() открывает файл и если он существует, то либо делает бэкап, либо просто стирает файл.
g_file_create() открывает с параметром O_CREAT | O_EXCL, что вызывает ошибку если файл уже есть.

Больше функций для открытия нет, по видимому.

Вот если бы сделать хак и подменить дескриптор на другой с "правильными" параметрами ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 26.5.2009, 9:02
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3293
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Как вариант можно попробовать использовать g_io_channel_seek, но данная функция работает с GIOChannel, а не с GOutputStream.

Плюс GIOChannel в том, что с помощью него можно работать не только с файлами, но и с пайпами и сокетами.
Если для тебя конечно же не принципиально использование GOutputStream.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
x51xxx
  опции профиля:
сообщение 27.7.2009, 16:46
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 27.7.2009
Пользователь №: 950

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(sabu @ 25.5.2009, 18:52) *
Нужно получить объект GOutputStream, дабы изменить определённые части существующего файла, но нужной функции для открытия файла я не нашол. Есть g_file_create, но она только создаёт файл и на существующий ругается; есть g_file_replace, но она полностью стирает файл; и есть g_file_append_to, но она не позволяет писать не в конец файла.

Проще конечно использовать fopen и fwrite, но раз уж я использую GTK+ и GLib, то хотелось бы использовать их методы.

Взагаліто в GLib є обгортка для С-ної функції fopen

FILE * g_fopen  (const gchar *filename, const gchar *mode);


читайти документацію http://library.gnome.org/devel/glib/2.20/g...-Utilities.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2020, 16:03