QFile doesn't recognize file:/// url path format

24.4k views Asked by At

I get the file path from Qml like this:

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

The above file path looks like this: file:///C:/uuuu.a3

But when this path is passed to QFile, it complains

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

How to solve this problem?

4

There are 4 answers

1
László Papp On BEST ANSWER

QString was not meant for a canonical url representation. It is a string class existing mostly due to the utf use cases.

What you are looking for is QUrl which was meant for use cases like this. Pass your path to that, and then get the "QFile-readable" path out of that, then pass it to QFile.

You will need to use the following method for the conversion before passing the path to QFile:

QUrl QUrl::fromLocalFile(const QString & localFile) [static]

Returns a QUrl representation of localFile, interpreted as a local file. This function accepts paths separated by slashes as well as the native separator for this platform.

This function also accepts paths with a doubled leading slash (or backslash) to indicate a remote file, as in "//servername/path/to/file.txt". Note that only certain platforms can actually open this file using QFile::open().

1
claudiub On
QUrl url(newProjectFileDlg.fileUrl);
url.toLocalFile();

This is probably what you need. It will return "C:/uuuu.a3" in your case.

0
Md. On

Have a look at QDir::toNativeSeparators(QString)

1
gremwell On

How annoying that QML doesn't have this stuff. I have created a helper function which can be called from the QML:

Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const;

Which simply does this:

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