Здравствуйте.
Столкнулся с ошибкой при проверки абсолютности пути средствами Qt на Linux, если пусть начинается с символа
двоеточия. Qt определяет такой путь, как абсолютный, что неверно для Linux.
Вот минимальный код для воспроизведения:
C++ (Qt)
qDebug() << QDir::isAbsolutePath(":");
qDebug() << QDir(":").isAbsolute();
qDebug() << QFileInfo(":").isAbsolute();
Данный код напечатает
true для всех трёх способов.
Версия Qt 4.7.0, Linux - Kubuntu 10.04.4 LTS, версия ядра 2.6.32-41-generic, x86_64. На более новых версиях Qt и Linux проверить сейчас нету возможности, но чуть позже обязательно это сделаю.
Проблема заключается даже не в этих методах (их можно заменить на свой, благо это просто), а в том, что из-за этого метод
QDir::cd() не работает правильно, если нам нужно перейти в папку, имя которой начинается с двоеточия. Дело в том, что в этом методе в начале проверяется не абсолютный ли путь, а потом путь проверяется на существование. Очевидно, такого пути не существует в системе, если рассматривать его как абсолютный (потому что он не абсолютный). И в итоге метод возвращает ошибку. Приходится вместо
C++ (Qt)
QString path = ":t-0012288";
current_directory.cd(path);
писать
C++ (Qt)
QString path = ":t-0012288";
current_directory.setPath(current_directory.absolutePath() + QDir::separator() + path);
что менее красиво и логично.
Я смотрел исходники Qt, но ошибки не нашёл - для Unix-систем проверка на абсолютность делается самым логичным образом: если первый символ - слеш, то путь абсолютный. Как может возникать баг - не знаю.
Собственно, вопросы.
- Вы сталкивались с этим?
- Может я всё таки что-то делаю не так и ошибка не в Qt, а у меня где-то?
- Что можете посоветовать? Как бы решили ситуацию вы?