2010-10-14 2 views
1

Я работаю над проблемой, когда мне нужно иметь способ конвертировать введенное пользователем имя файла в уникальное имя пути. Предположим, я дал пользователю указать имя пути, указывающее на файл, содержащий некоторые данные. Затем я смогу сделать Data* pData=Open(PathName). Теперь, если пользователь снова задает одно и то же имя пути, я хотел бы иметь таблицу уже открытых файлов и просто возвращать указатель на те же данные: Data* pData2=GetOpenedData(PathName). Это легко сделать с помощью простого std::map<std::string,Data*>, проблема в том, что различные значения PathName могут указывать на один и тот же файл. Самый простой случай - это нечувствительность к регистру Windows.Поиск уникального имени пути для заданного ввода

Код кросс-платформенный C++, и у меня нет доступа к материалам .NET (но я рад #ifdef различиям между Windows и UNIX, если необходимо). Кто-нибудь знает о функциях Windows API или POSIX, которые могут принимать имя пути и возвращать уникальную (к системе) строку, которую я могу отключить. Ключ не должен быть одинаковым в обеих системах (Windows/POSIX), просто уникален в исполняемом экземпляре моего кода.

На данный момент меня не беспокоят ссылки или два способа добраться до одного и того же файла. Например, в Windows, если я имел \ myserver \ share, сопоставленный с S: then \ myserver \ share \ blah и S: \ blah - это тот же файл, но я могу жить с теми, которые считаются разными. Но S: \ blah и S: \ Blah должны быть одинаковыми. Если есть способ сделать \ myserver \ share и S: \ также уникальным, это бонус, и я был бы очень доволен, но я могу жить без него. (Аналогично, если в UNIX есть несколько ссылок на один и тот же файл).

Edited добавить:

Это не так просто, как просто делать без учета регистра поиска в окнах. Например: c://data/mydata.dat в то время как это «недействителен» имя файла, окна будет принимать его, и он будет actualy пункт c:\data\mydata.dat

отредактирован добавить еще одну вещь:

Я хотел бы также c:\mydirectory\..\blah.dat быть признанным в то же самое c:\blah.dat

ответ

0

Для Windows, PathCanonicalize() - твой друг. Пакет переноса оболочки в Windows имеет несколько дополнительных процедур, которые помогут вам.

К сожалению, я не уверен, что эквивалент Unix этого пакета.

0

Для Windows вы можете сохранить полный путь к ресурсу, создавая все строчные (или прописные).

Я не использую * nix, поэтому не могу сказать об этом. Но я считаю, что в случае с системами nix систем имеет значение (\home\a и \home\A разные). Если это так, вы можете опустить преобразование случая ввода пользователя для * nix.

0

Вы можете опционально создать std::map с третьим аргументом шаблона, который является функцией сравнения/функтором (см., Например, http://www.cplusplus.com/reference/stl/map/). Вы можете предоставить функцию сравнения строк без учета регистра.

Я считаю, что Скотт Мейерс является хорошим примером такой функции в Effective STL; Я могу проверить это, когда вернусь домой.

Смежные вопросы