Разделители в пути к файлу, '/' и '\' |
Здравствуйте, гость ( Вход | Регистрация )
Разделители в пути к файлу, '/' и '\' |
Анна |
21.11.2013, 14:45
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Столкнулась с тем, что если составляю путь к файлу, например,
QString file_name = QCoreApplication::absoluteDirPath() + QDir::separator() + my_dir + QDir::separator() + name; то часть резделителей виндовые, а часть линуксовые. QFile и QDir к этому относятся спокойно, но вот когда приходится сравнивать строковые значения, одно из которых создано, как показано выше, а другое приходит извне и указывает на тот же самый файл, возникает печалька... QCoreApplication::absoluteDirPath() под виндой возвращает линуксовые разделители. Можно ли с этим что-то сделать? ... Обнаружила, что мне приходит полный путь до файла тоже с линуксовыми разделителями. И получают его из QFile::fileName(); Выходит, особенности системы учитывает только QDir::separator(). Сообщение отредактировал Анна - 21.11.2013, 14:54 |
|
|
Majestio |
21.11.2013, 15:16
Сообщение
#2
|
Студент Группа: Участник Сообщений: 67 Регистрация: 13.2.2013 Пользователь №: 3710 Спасибо сказали: 1 раз(а) Репутация: 1 |
Непонятно только в чем вопрос
По мне, так я использую везде юниховый синтаксис, венда его кушает спокойно ... пока, по крайней мере. Для рассовой чистоты конечно можно сделать замену в строке / на \ , только пока в этом смысла не вижу. |
|
|
Анна |
21.11.2013, 15:42
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Ворос был в том, что пути к одному и тому же файлу выглядят по разному: "c:/xxx/xxx/xxxx\xxx\xxx" и "c:/xxx/xxx/xxxx/xxx/xxx".
В документации QDir прочитала, что не рекомендуется использовать QDir::separator(), лучше всегда '/'. А для вывода в виде, соответствующем системе, использовать QDir::toNativeSeparators() и для обратного действия QDir::fromNativeSeparators(). Выходит, мне все имена файлов нужно гнать через эти функции, например, перед сравнением. Я просто никогда не сталкивалась с таким, поэтому несколько озадачилась. Тем более, что такое преобразование есть только у QDir, но не у QFile (впрочем, тут можно понять), не у QFileInfo. .... Вылезла ещё такая неприятность: какие-то методы возвращают имя устройства в виде маленькой буквы, а какие-то в виде большой... Вобщем, сравнивать имена файлов в виде строк даже внутри одной программы дурное занятие. И что делать? Мне приходит имая файла и некоторая информация о нём, которую надо отображать в таблице. Я считала, что имя файла вполне подходит для поиска нужной строки, выходит - нет... Сообщение отредактировал Анна - 21.11.2013, 15:57 |
|
|
Iron Bug |
21.11.2013, 15:49
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
тоже использую юниксовский формат везде. в кроссплатформе это особенно удобно.
венда понимает и такие пути. и не надо лишнего экранирования обратного слэша. |
|
|
Анна |
21.11.2013, 16:00
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
я сделала замену везде на линуксовый разделитель. Вылезла другая проблема. В одних путях устройство маленькой буквой обозначается, а в других с большой.
|
|
|
Litkevich Yuriy |
21.11.2013, 16:15
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А я вообще никогда не использую QDir::separator(), всегда в виде строки добавляю:
"/" и всё, а когда нужно получить форму для текстового сравнения делаю приведение явно: QString path = QDir::cleanPath ( fooPath ) path = QDir::toNativeSeparators (path) А вообще предпочитаю не использовать строки для сравнения, т.к. путь может быть абсолютным ил относительным, и т.п. |
|
|
Анна |
21.11.2013, 16:37
Сообщение
#7
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
И что же делать в моём случае?
Из всего, что мне приходит, для точного определения строки в таблице, я могу использовать только имя файла и полным путём (собственно на том, что полный путь до файла всегда уникален и строилась вся задумка). Слеши теперь не проблема, а вот большая и маленькая буквы уже вынуждают извращаться. Выходит, мне в таблице нужно или хранить QFile, что как-то нелепо, или QFileInfo, или городить кучу преобразований, чтобы привести строки с путём к единому виду? В общем, маленький классик, выводящий информацию в табличку, начинает превращаться в какого-то монстра. Сообщение отредактировал Анна - 21.11.2013, 16:42 |
|
|
Iron Bug |
21.11.2013, 18:52
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
обычно сравнение строк имеет параметр не учитывать регистр.
в Qt это QString::compare(a, b, Qt::CaseInsensitive) (google всё быстро находит). |
|
|
Анна |
22.11.2013, 8:41
Сообщение
#9
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Угу, но тот же гугль нам сообщает, что в Линуксе регистр в именах файлов имеет значение, так что CaseInsensitive не катит.
Я нашла "виновника торжества"! QFileInfo::absoluteFilePath() возвращает строку, где устройство указано с большой буквы, подобные же функции у других классов возвращают маленькую букву. Буду поступать, как нормальные герои. |
|
|
Majestio |
22.11.2013, 10:52
Сообщение
#10
|
Студент Группа: Участник Сообщений: 67 Регистрация: 13.2.2013 Пользователь №: 3710 Спасибо сказали: 1 раз(а) Репутация: 1 |
Анна, не забывай, что нормальные герои еще учитывают возможное наличие хард-линков.
А при сравнении можешь получить совсем не геройский результат ... (даже в венде есть точки соединения)! |
|
|
Текстовая версия | Сейчас: 2.1.2025, 15:54 |