Как закодировать путь к файлу в имени файла? (без коллизий, кроссплатформенность)

Как я могу закодировать путь к файлу в имени файла, чтобы имя файла было действительным и не было коллизий? Другими словами:

  • Результирующее имя файла не содержит специальных символов, таких как '\', ':' или '/'.
  • Два разных пути к файлам никогда не кодируются в одно и то же имя файла.

Пример: путь к файлу "C: \ Program Files \ My Program" -> имя файла "NGQqKY4pBaP7lPKQPD6Y ..."

Этот пример предназначен только для иллюстрации; могут быть лучшие (и более простые) способы сделать это.

Предпосылки проблемы: Эта кодировка пути к файлу используется для простой проверки одного экземпляра в Java: два экземпляра программы могут быть запущены одновременно, если они расположены в разных каталогах, но не в том случае, если они находятся в одном и том же каталоге. Я знаю, что есть другие способы обеспечить свойство единственного экземпляра, но я считаю, что кодировка пути к файлу является лучшей с точки зрения соотношения затрат и выгод в моей конкретной ситуации.


person python dude    schedule 27.01.2011    source источник


Ответы (1)


Используйте строку пути и кодируйте только специальные предложения, например:

% -> %%
\ -> %)
/ -> %(
: -> %;

Больше никаких специальных символов, но все же полезно и читабельно. Однако, поскольку вы просто хотите обеспечить уникальность, лучшим (но не обратимым решением) может быть:

: -> ;
\ -> %
/ -> %
% -> %

Я не верю, что в вашей файловой системе будет какой-то% file и какой-то / file, так что это может сработать для вас достаточно хорошо.

person Daniel    schedule 27.01.2011
comment
Но тогда имена C: \ foo \ bar.txt и C: \ foo%) bar.txt будут одинаковыми. - person Mariy; 27.01.2011
comment
Тогда воспользуйтесь моей первой конверсией. Я бы выбрал второй, потому что НИ ОДНОГО не имеет файла foo%) bar.txt в его папках, И и папки / файла с именем foo / bar.txt. - person Daniel; 27.01.2011
comment
Да, ты прав. Достаточно первого преобразования. :) - person Mariy; 27.01.2011