Я работаю над проблемой, когда мне нужно иметь способ конвертировать введенное пользователем имя файла в уникальное имя пути. Предположим, я дал пользователю указать имя пути, указывающее на файл, содержащий некоторые данные. Затем я смогу сделать 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