crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Разделители в пути к файлу, '/' и '\'
Анна
  опции профиля:
сообщение 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  


Анна, не забывай, что нормальные герои еще учитывают возможное наличие хард-линков.
А при сравнении можешь получить совсем не геройский результат ... (даже в венде есть точки соединения)!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 2.1.2025, 15:41