crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Разделители в пути к файлу, '/' и '\'
Анна
  опции профиля:
сообщение 22.11.2013, 12:04
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


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

Цитата
(даже в венде есть точки соединения)!

Ну, если мой партнёр умудрится за один и тот же сеанс прислать мне строки с разными путями до одного и того же файла, я с этим в любом случае ничего поделать не смогу - будет в таблице несколько строк об одном и томже.

Просто, полезно знать, что если в QFileInfo передали полный путь к файлу (безо всяких изысков), то QFileInfo::absoluteFilePach(), вернёт строку , в общем случае, не равную переданной.

QString addPath = QApplication::applicationDirPath();   // addPath будет "e:/My/Path"
QFileInfo info(appPath);
info.absoluteFilePath();   // эта функция вернёт "E:/My/Path"


Сообщение отредактировал Анна - 22.11.2013, 12:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Majestio
  опции профиля:
сообщение 22.11.2013, 14:15
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 13.2.2013
Пользователь №: 3710

Спасибо сказали: 1 раз(а)




Репутация:   1  


Цитата(Анна @ 22.11.2013, 12:04) *
Мне строка с путём к файлу приходит извне, с компа,который может быть под виндой, а может быть и под линуксом

Ну тогда и алгоритм обработки простейший:
1) Строку собираем, если надо, используя '/'
2) Если первый символ строки '/' - это юних и ничего не делаем
3) Иначе все символы - в прписные, и замену всех '/' на '\'
4) Потом сравнения
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.11.2013, 16:19
Сообщение #13


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Анна @ 22.11.2013, 11:41) *
Угу, но тот же гугль нам сообщает, что в Линуксе регистр в именах файлов имеет значение, так что CaseInsensitive не катит.

ну, как вопрос был задан - так я на него и ответила.
естественно, что в никсах "размер имеет значение". но и юзер не просто так набивает данные, а с учётом регистра. если промахнулся - не будет совпадения. а если юзер явно хочет сравнение без регистров, то он должен понимать, что делает.
и да, таки в никсах есть хард и софт линки. в венде такого вообще нет. точнее, есть в NTFS, но в венде это реализовано только на уровне системы и используется в серверах, а юзер этим не пользуется и часто даже не подозревает.


Цитата(Majestio @ 22.11.2013, 17:15) *
Если первый символ строки '/' - это юних и ничего не делаем

да и венда спокойно такие пути кушает, как относительные. а вот относительно чего - это уже смотря как софт это интерпретирует.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Majestio
  опции профиля:
сообщение 23.11.2013, 11:35
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 13.2.2013
Пользователь №: 3710

Спасибо сказали: 1 раз(а)




Репутация:   1  


Iron Bug,

Цитата(Iron Bug @ 22.11.2013, 16:19) *
да и венда спокойно такие пути кушает, как относительные. а вот относительно чего - это уже смотря как софт это интерпретирует.


Я написал первым пунктом "1. Строку собираем, если надо, используя '/'" - а это значит, что путь к п.2 становится абсолютным.


Цитата(Iron Bug @ 22.11.2013, 16:19) *
в венде такого вообще нет. точнее, есть в NTFS, но в венде это реализовано только на уровне системы и используется в серверах, а юзер этим не пользуется и часто даже не подозревает.

Зависит от юзера. Имеея NTFS и утилиты Марка Руссиновича (junction), юзер может творить чудеса. Вот я творю :lol:

Сообщение отредактировал 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  


Цитата(Iron Bug @ 22.11.2013, 16:19) *
ну, как вопрос был задан - так я на него и ответила.
естественно, что в никсах "размер имеет значение". но и юзер не просто так набивает данные, а с учётом регистра. если промахнулся - не будет совпадения. а если юзер явно хочет сравнение без регистров, то он должен понимать, что делает.

Не спорю, но согласитесь, что если возникает необходимость сравнить абсолютные пути к файлам, то единообразие кода для никсов и винды пропадает. Это особенно обидно, что на отправляющей стороне пользователь ничего руками не трогает, просто абсолютный путь самой программой, вернее несколькими программами, берётся от разных источников: из QFile, из диалога выбора файлов, из QFileInfo...


Цитата(Litkevich Yuriy @ 23.11.2013, 15:26) *
Лучше сразу определится, имеем ли мы дело с именем файла или какой-то произвольной строкой.
Если с именем файла, то все манипуляции выполняем с помощью соответствующих классов (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.

Цитата(Iron Bug @ 25.11.2013, 17:51) *
можно использовать 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  


Цитата(Анна @ 26.11.2013, 11:11) *
но количество информации, которую надо переварить, да ещё и на английском, меня повергает в уныние. Времени не хватает.
у нас на форуме есть раздел посвещённый Boost-у.
Да и Iron Bug в нём ориентируется, как у себя дома, можно поспрашивать если что-то не понятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


9 чел. читают эту тему (гостей: 9, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.1.2025, 2:02