Quite some time ago, I showed how to filter the Browse for Folder dialog so it shows only drive letters. There’s a small quirk in the code, which it has taken me several years to getting around to addressing.
But hey, better late than never.
To recap, we detected drive letters by verifying that the length is at most 4, and that it is reported as a root directory by PathÂIsRoot
. While this successfully allows drives A:\
through Z:\
, the PathÂIsÂRoot
function also reports \\a
through \\z
as roots if you had a server with a one-character name. It also reports \
as a root, which is I guess sort of true?
Now, these aren’t problems in practice because you cannot add \\a
or \
as children of My Computer, or at least, you can’t do it today. But just to make sure, let’s reject those cases.
Fortunately, the fix is simple: Instead of using PathIsRoot
, we switch to PathGetDriveNumber
, which returns −1 if the path does not begin with a letter and a colon.
if (SUCCEEDED(StrRetToBuf(&str, pidlItem, buf, ARRAYSIZE(buf))) && /* PathIsRoot(buf) */ PathGetDriveNumber(buf) >= 0) return S_OK;
There is still a tiny hole here: If someday it becomes possible to add raw drive letters to My Computer, then this will accept A:
as well as A:\
. I’m not sure what that would even mean, but you could wear a belt and suspenders by using PathÂIsÂRoot
to verify that you got a root, and then using PathÂGetÂDriveÂNumber
to verify that you got a drive.
\
is a relative path. It’s unfortunate that it is also considered a root.It is very rare that
\\server
is useful when dealing with paths,\\server\share
is what you want (PathIsUNCServerShare).yes,you are right