xintrea / mytetra_dev

MyTetra - smart crossplatform manager for information collecting / MyTetra - кроссплатформенный менеджер накопления информации / Официальная страница:
http://webhamster.ru/site/page/index/articles/projectcode/105
254 stars 55 forks source link

Использование относительных путей к файлам #67

Closed Alexilmarranen closed 7 years ago

Alexilmarranen commented 7 years ago

Возможно ли использование в базе относительных путей к файлам для аттачей типа "link", причем таким образом, чтобы путь был относительным по отношению к директории data? Дело в том, что относительные пути такого рода дадут возможность использовать базу с прикрепленными файлами, лежащими в директории рядом с базой, совместно на нескольких компьютерах через синхронизируемый файловый ресурс. Добавление аттачей с путями относительными директории приложения дело тривиальное, а вот относительно директории базы сильно сложнее, как я понимаю.

xintrea commented 7 years ago

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

Alexilmarranen commented 7 years ago

Если Вы имеете ввиду то, как я вижу выбор относительных путей в интерфейсе - то в этом нет необходимости - путь из абсолютного конвертируется в относительный и пользователю абсолютно не важно что храниться в базе, ведь он в итоге работает в интерфейсе с абсолютными путями. Если же вопрос про выбор именно типа путей для ссылок, то в интерфейсе это может быть чекбокс "Использовать относительные пути для линков", если данная функция все-таки будет уверенно реализована и протестирована. Первично наверное стоит сделать такой переключатель в виде строки в конфиге (что я и сделал у себя, успешно собрал и протестировал вручную в работе для варианта с преобразованием и хранением относительных путей, которые берутся от директории приложения). Однако такой вариант (с путями, которые относительны от директории приложения) не решает проблемы совместного использования, если само приложение не лежит на разделяемом ресурсе и не запускается всеми пользователями с разделяемого ресурса.

xintrea commented 7 years ago

Тогда как вам другие варианты:

  1. Добавить в настройки "Префикс для относительных путей". Чтобы была возможность задавать относительные пути не относительно базы, а вообще относительно чего угодно.

  2. Или сделать интеллектуальное преобразование пути "на лету", например через задаваемое регулярное выражение.

  3. Не заморачиваться с путями, а решить проблему на уровне файловой системы и линков на нужные директории.

Alexilmarranen commented 7 years ago

Я пока не очень хорошо понимаю архитектуру MyTetra, поэтому мои рассуждения могут быть слегка неверными. Однако вот что я думаю:

  1. Префикс для относительных путей для моего случая (>1 пользователя на ОС Linux) должен полностью решить проблему. В базе таким образом будет храниться путь от какой-либо директории и линки на файлы по этому пути будут работать у всех пользователей. Но для этого необходимо, чтобы пользователь выбрал не сам префикс, а именно "базовую" директорию и директорию, в которой хранятся файлы. Пример: разделяемый ресурс - директория с содержимым ./share ./share/docs ./share/mytetra ./share/mytetra/data ./share/mytetra/trash Далее - пользователи user1, user2 и user3. Соответственно для каждого из них пути хранения файлов будут выглядеть например так: /home/user1/share, /home/user2/Documents/share и /usr/share. Соответственно где-то в настройках каждый из пользователей задает разделяемую директорию с файлами, на которые в базе есть линки и базовую директорию (предположим это директория data). Для пользователя user1 - /home/user1/share/docs для файлов и /home/user1/share/mytetra/data в качестве базовой; Для пользователя user2 - /home/user2/Documents/docs для файлов и /home/user2/Documents/mytetra/data в качестве базовой Для пользователя user3 - /usr/share/docs для файлов и /usr/share/mytetra/data в качестве базовой. Таким образом для того, чтобы все три пользователя получали доступ к ссылкам на файлы в базе необходимо будет хранить ссылки такого вида: ../docs/file1, ../docs/file2 и т.п. А уже каждый экземпляр программы пользователей будет вычислять для работы полный путь, зная относительный и базовый (в некотором роде префикс). Одним словом ключевая мысль - для совместной работы с линками в базе необходимо высчитывать относительный путь между самими файлами и какой-то общей точкой в файловой системе у всех пользователей. Можно конечно дать пользователю возможность выбирать эту общую точку, но вообще-то на роль такой общей точки идеально подходит именно директория data, потому как именно она точно будет присутствовать у всех пользователей, которые работают в базе. Минусы такого подхода - вряд ли получится сделать такое решение кросплатформенным (на мой взгляд, возможно я не прав).
  2. Вариант с регулярным выражением не очень понял. Это относится к технической реализации расчета полного пути из относительного и обратно?
  3. Я попробую этот вариант в своем окружении и напишу позже.
Alexilmarranen commented 7 years ago

Я проверил вариант с решением проблемы на уровне файловой системы и созданием симлинков. Действительно, этот вариант работает как надо, если у всех машин, которые разделяют ресурс, имеется симлинк на разделяемый ресурс (или его часть), который хранит те файлы, на которые надо ссылаться в базе. Лично я для такого симлинка выбрал путь в директории /home. Таким образом у пользователей базы, являющейся разделяемым ресурсом, осталось два ограничения:

  1. Указывать путь до файла необходимо через симлинк;
  2. Работает такой способ только для *nix.

Лично для меня проблема полностью решена (если не всплывет каких-то других обстоятельств в процессе использования). Если вы считаете, что более нативная реализация в MyTetra не требуется, то issue наверное можно закрывать. Спасибо за идею, не понимаю как я сам не догадался %)