Разделители в пути к файлу, '/' и '\' |
Здравствуйте, гость ( Вход | Регистрация )
Разделители в пути к файлу, '/' и '\' |
Анна |
22.11.2013, 12:04
Сообщение
#11
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Это не мой случай.
Мне строка с путём к файлу приходит извне, с компа,который может быть под виндой, а может быть и под линуксом . В принципе, моей программе абсолютно наплевать, что ей приходит в строке, лишь бы она могла работать уникальным ключом. Просто так совпало, что приходят пути к файлу (чем не уникальный ключ!), и обнаружилось, что пути к одному и тому же файлу выглядят по-разному. Цитата (даже в венде есть точки соединения)! Ну, если мой партнёр умудрится за один и тот же сеанс прислать мне строки с разными путями до одного и того же файла, я с этим в любом случае ничего поделать не смогу - будет в таблице несколько строк об одном и томже. Просто, полезно знать, что если в QFileInfo передали полный путь к файлу (безо всяких изысков), то QFileInfo::absoluteFilePach(), вернёт строку , в общем случае, не равную переданной.
Сообщение отредактировал Анна - 22.11.2013, 12:06 |
|
|
Majestio |
22.11.2013, 14:15
Сообщение
#12
|
Студент Группа: Участник Сообщений: 67 Регистрация: 13.2.2013 Пользователь №: 3710 Спасибо сказали: 1 раз(а) Репутация: 1 |
Мне строка с путём к файлу приходит извне, с компа,который может быть под виндой, а может быть и под линуксом Ну тогда и алгоритм обработки простейший: 1) Строку собираем, если надо, используя '/' 2) Если первый символ строки '/' - это юних и ничего не делаем 3) Иначе все символы - в прписные, и замену всех '/' на '\' 4) Потом сравнения |
|
|
Iron Bug |
22.11.2013, 16:19
Сообщение
#13
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Угу, но тот же гугль нам сообщает, что в Линуксе регистр в именах файлов имеет значение, так что CaseInsensitive не катит. ну, как вопрос был задан - так я на него и ответила. естественно, что в никсах "размер имеет значение". но и юзер не просто так набивает данные, а с учётом регистра. если промахнулся - не будет совпадения. а если юзер явно хочет сравнение без регистров, то он должен понимать, что делает. и да, таки в никсах есть хард и софт линки. в венде такого вообще нет. точнее, есть в NTFS, но в венде это реализовано только на уровне системы и используется в серверах, а юзер этим не пользуется и часто даже не подозревает. Если первый символ строки '/' - это юних и ничего не делаем да и венда спокойно такие пути кушает, как относительные. а вот относительно чего - это уже смотря как софт это интерпретирует. |
|
|
Majestio |
23.11.2013, 11:35
Сообщение
#14
|
Студент Группа: Участник Сообщений: 67 Регистрация: 13.2.2013 Пользователь №: 3710 Спасибо сказали: 1 раз(а) Репутация: 1 |
Iron Bug,
да и венда спокойно такие пути кушает, как относительные. а вот относительно чего - это уже смотря как софт это интерпретирует. Я написал первым пунктом "1. Строку собираем, если надо, используя '/'" - а это значит, что путь к п.2 становится абсолютным. в венде такого вообще нет. точнее, есть в NTFS, но в венде это реализовано только на уровне системы и используется в серверах, а юзер этим не пользуется и часто даже не подозревает. Зависит от юзера. Имеея NTFS и утилиты Марка Руссиновича (junction), юзер может творить чудеса. Вот я творю Сообщение отредактировал Majestio - 23.11.2013, 11:37 |
|
|
Litkevich Yuriy |
23.11.2013, 15:26
Сообщение
#15
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Лучше сразу определится, имеем ли мы дело с именем файла или какой-то произвольной строкой.
Если с именем файла, то все манипуляции выполняем с помощью соответствующих классов (QDir, QFile, QFileInfo) они сам разрулят все регистры слэши и т.п.). Если произвольная строка, то тогда и обработка другая. |
|
|
Анна |
25.11.2013, 12:45
Сообщение
#16
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
ну, как вопрос был задан - так я на него и ответила. естественно, что в никсах "размер имеет значение". но и юзер не просто так набивает данные, а с учётом регистра. если промахнулся - не будет совпадения. а если юзер явно хочет сравнение без регистров, то он должен понимать, что делает. Не спорю, но согласитесь, что если возникает необходимость сравнить абсолютные пути к файлам, то единообразие кода для никсов и винды пропадает. Это особенно обидно, что на отправляющей стороне пользователь ничего руками не трогает, просто абсолютный путь самой программой, вернее несколькими программами, берётся от разных источников: из QFile, из диалога выбора файлов, из QFileInfo... Лучше сразу определится, имеем ли мы дело с именем файла или какой-то произвольной строкой. Если с именем файла, то все манипуляции выполняем с помощью соответствующих классов (QDir, QFile, QFileInfo) они сам разрулят все регистры слэши и т.п.). Если произвольная строка, то тогда и обработка другая. Вот об этом-то и шла речь. Для моей стороны приходит строка, которая имеет формат полного пути к файлу на каком-то другом компе. QFileInfo организует маленькую подствау в виде обозначения устройства с большой буквы в абсолютном пути, в то время, как QDir и QFile возвращают маленькую букву при аналогичном запросе. Думала, что можно обойти проблему, прогоняя все строки через QFileInfo, тоже получилось не совсем корректно - к линуксовым путям добавляется текущее устройство, если моя программа работает под виндой; для сравнения строк, конечно, такой вариант подходит , но при выводе на экран, возникает недоумение. |
|
|
Iron Bug |
25.11.2013, 17:51
Сообщение
#17
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
единого формата путей для венды и никсов нет. тут ничего не поделать.
как вариант, можно использовать boost::filesystem. там множество функций, специально заточенных про замену слэшей и прочее такое, чтобы повысить переносимость кода. |
|
|
Анна |
26.11.2013, 9:11
Сообщение
#18
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Я сделала компромисное решение. Для вывода на экран (DisplayRole) кладу то, что присылают, а для поиска в UserRole кладу эту же строку, пропущенную для едионобразия через QFileInfo.
можно использовать boost::filesystem Давно интересуюсь этими библиотеками (в Хакере постоянно проскакивают ), но количество информации, которую надо переварить, да ещё и на английском, меня повергает в уныние. Времени не хватает. |
|
|
Iron Bug |
26.11.2013, 12:44
Сообщение
#19
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
при программировании на С++ имеет смысл обратить внимание на boost.
boost - не просто кроссплатформенная библиотека. это полигон стандартизации С++. то есть, там отрабатываются будущие стандатные библиотеки С++. после обкатки в boost'е, библиотеки переходят в стандарт. документация там хорошая(хотя и на английском). плюс множество примеров. на русскую документацию надеяться не стоит. программист должен свободно читать техническую литературу на английском. это просто факт. иначе - оставание от технологий. потому что переводы отстают на много лет. Сообщение отредактировал Iron Bug - 26.11.2013, 12:46 |
|
|
Litkevich Yuriy |
26.11.2013, 13:46
Сообщение
#20
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Текстовая версия | Сейчас: 18.1.2025, 1:56 |