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

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

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

Приведенный выше путь к файлу выглядит следующим образом: file:///C:/uuuu.a3

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const;

Который просто делает это:

QString OurClassName::convertUrlToNativeFilePath(const QUrl& urlStylePath) const
{
    return QDir::toNativeSeparators(urlStylePath.toLocalFile());
}

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

Другие вопросы по тегам