QFile не распознает формат пути file:/// URL

Я получаю путь к файлу из Qml следующим образом:

mainView.projectFilePath = Qt.resolvedUrl(newProjectFileDlg.fileUrl).toString();

Приведенный выше путь к файлу выглядит так: file:///C:/uuuu.a3

Но когда этот путь передается в QFile, он жалуется

The filename, directory name, or volume label syntax is incorrect

Как решить эту проблему?


person Dean Chen    schedule 07.01.2014    source источник


Ответы (4)


QString не предназначался для канонического представления URL. Это строковый класс, существующий в основном из-за вариантов использования utf.

То, что вы ищете, это QUrl, предназначенный для таких случаев использования. Передайте свой путь к этому, а затем получите путь для чтения QFile из этого, а затем передайте его в QFile.

Вам нужно будет использовать следующий метод для преобразования перед передачей пути к QFile:

QUrl QUrl::fromLocalFile(const QString и localFile) [статические]

Возвращает QUrl-представление localFile, интерпретируемое как локальный файл. Эта функция принимает пути, разделенные косой чертой, а также собственный разделитель для этой платформы.

Эта функция также принимает пути с двойной косой чертой в начале (или обратной косой чертой) для обозначения удаленного файла, как в //имя_сервера/путь/к/файлу.txt. Обратите внимание, что только некоторые платформы могут открыть этот файл с помощью QFile::open().

person lpapp    schedule 07.01.2014
comment
Для меня QUrl( "file:///C:/myfile.txt" ).toLocalFile(); выполняет преобразование в "C:/myfile.txt", а fromLocalFile просто добавляет "file:///". Также см. этот ответ ниже. - person handle; 17.08.2016

QUrl url(newProjectFileDlg.fileUrl);
url.toLocalFile();

Это, вероятно, то, что вам нужно. В вашем случае он вернет «C:/uuuu.a3».

person claudiub    schedule 17.02.2014
comment
Это правильный ответ на вопрос, а не принятый. - person Ayberk Özgür; 26.07.2016

Как раздражает, что QML не имеет этого материала. Я создал вспомогательную функцию, которую можно вызвать из QML:

Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const;

Что просто делает это:

QString OurClassName::convertUrlToNativeFilePath(const QUrl& urlStylePath) const
{
    return QDir::toNativeSeparators(urlStylePath.toLocalFile());
}
person gremwell    schedule 04.09.2015
comment
Спасибо, это было полезно - person arynaq; 18.03.2017

Посмотрите на QDir::toNativeSeparators(QString)

person Md.    schedule 11.08.2015