Есть ли способ заставить быстрое определение типа контента для медленной файловой системы - PullRequest
6 голосов
/ 19 марта 2012

У меня есть виртуальная файловая система, которая по своей сути медленная, потому что она использует веб-сервис в качестве бэкэнда (Google Docs API).

Это прекрасно работает с одной оговоркой: приложения GTK используют GtkFileChooser, который пытается определить тип содержимого для файла, чтобы отобразить значок или что-то еще.Когда он встречает файл, который он не может распознать по расширению, он считывает начальный фрагмент данных, чтобы попытаться использовать его для определения типа файла.В моем случае это приводит к загрузке всего файла из сети, что чрезвычайно замедляет листинг каталога в диалоговых окнах файлов.

Оказывается, что Gio (серверная часть для GtkFileChooser) поддерживает 2 режима для регулярного обнаружения типов контента (с атрибутом 'standard :: content-type') и fast ('standard :: fast-content-type'), который смотрит только на расширение файла.Однако, похоже, что GtkFileChooser запрашивает только «стандартный :: тип контента».

Всегда ли GTK пытается использовать медленный алгоритм для обнаружения типа контента?Даже для известных медленных файловых систем, таких как NFS?

Есть ли способ смонтировать мою файловую систему так, чтобы она использовала только быстрое обнаружение типов контента?

1 Ответ

2 голосов
/ 05 апреля 2012

Глядя на исходный код glib, я полагаю, что нет способа форсировать быстрое обнаружение типа контента для виртуальной файловой системы, которая смонтирована в иерархии файловой системы ОС.Из POV GIO это локальная файловая система, поэтому предполагается, что он имеет быстрый доступ для чтения.На другие удаленные файловые системы (например, NFS) это не влияет, так как для точного обнаружения по типу контента требуется только просмотр первых 4 КБ данных.

Поэтому для вашего случая я предлагаю следующее решение:

  1. Скачать исходный код glib.В Ubuntu вы можете сделать это, набрав:

    apt-get source glib2.0
    
  2. Откройте файл gio/glocalfile.c.

  3. Найдите функцию get_content_type.
  4. В начале функции добавьте следующую строку:

    fast = 1;
    
  5. Скомпилируйте glib.

  6. Либо установите glib в системуlocation или используйте LD_PRELOAD для загрузки новой библиотеки gio.

Надеюсь, это поможет.Не стесняйтесь сказать мне, если вам нужно больше деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...