[Interest] Handling of ~ paths

Scott Bloom scott at towel42.com
Thu Jun 11 20:33:51 CEST 2020


On 11/06/2020 14.03, Scott Bloom wrote:
> If you are working with a path, for use in QDir, QFileInfo, QFile etc 
> etc, and the path string is using a ~, either of the form ~/foo.txt or 
> ~user/foo.txt, Qt seems to be treating it as a relative path of the 
> current user, and prepends “/home/scott” in my case to the path,


Uh... yeah? A path starting with "~/" or "~<user>/" has been "shorthand" 
for that user's home directory ("~/" → current user) for decades. I'm not sure what you were expecting?

   $ cd /
   $ ls -d ~
   /home/matthew

===========
Maybe I wasn’t clear, that is 100% exactly what I would expect.

User entry, ~/foo.txt, I would 100% expect QFileInfo( "~/foo.txt" ).absoluteFilePath() to return "/home/scott/foo.txt"

But instead what is returned is "/home/scott/~/foo.txt"

> and of course, the canonicalPath returns an empty string because that 
> file path is invalid and doesn’t exist.

Why is it invalid? Did you somehow manage to have your home directory not exist?

=====
See above, the returned path is /home/scott/~/foo.txt

> What is the Qt way to handle this?  It cant be to tell your users not 
> to use ~.  Can it?

If your intention is to treat "~/foo" as a relative path, the first component of which is literally "~", then... yeah, don't do that; that isn't the "traditional" interpretation of such a path. If that's what you want, use "./~/foo" instead. (If you just need to suppress tilde expansion, you may be able to check for paths that start with "~" and always add "./" to the beginning of them. Beware, however, that users that expect tilde expansion to work may be confused or annoyed.)

--
==========
My problem is QFileInfo, QDir and QFile do not appear to be doing the ~ expansion

Scott


More information about the Interest mailing list