检查文件名是否是有效的Windows名称

6

我想检查我的字符串是否是有效的Windows文件路径。我搜索了一下,好像没有可靠的方法来做到这一点。我还检查了boost文件系统库,似乎没有明显的函数存在来进行此检查,也许类似于is_valid_windows_name的功能。


您需要检查提供的路径是否仅有效,还是有效并且目录结构已经为该路径设置好,或者那里已经存在一个文件吗? - Jamie Wong
天啊,这不是重复的问题,因为另一个标记了C#,并且被接受的答案给出了C#的API,而这个标记了C++。 - Jim Balter
不妨尝试在Windows上创建一个同名文件,看看是否成功?(也许你可以只是为了试验而稍微更改一下路径。) - cshu
4个回答

1
你可以使用 _splitpath() 函数并解析输出(基于它,你可以轻松地判断你的路径是否有效)。
请参阅 MSDN 获取更多信息。
请注意,此函数仅适用于 Windows。

1

我不相信有一个标准的C++ API可以做到这一点。

请注意,Windows API允许使用比Windows Shell更多的文件名(用户在Windows资源管理器中允许使用的文件名)。

您应该查看Windows Shell API。

另一个可能性是使用试错法,这样您就可以真正独立于当前的文件系统。

最简单的方法是禁止使用以下字符:

\ / < > | " : ? *

这样你就没问题了。


1

是的,有一个提升功能可以实现你想要的效果。请查看boost::filesystem::windows_name(...)。你需要包含boost/filesystem/path.hpp,并链接正确(版本和体系结构特定的)libboost_system和libboost_filesystem库,因为path不是一个仅头文件的库。


如果仅仅是这个用途,Boost可能有点过头了,但是Boost提供了许多下一代C++特性,使其对于一般的C++开发非常值得。当你已经在使用Boost时,这是一个很好的选择。 - sage

0

可惜的是,即使是最新的C++17文件系统库也没有验证文件名的功能。

您可以使用Windows特定的Shell轻量级实用程序函数PathFileExistsWindows APIGetFileAttributes并检查最后一个错误代码是否为ERROR_INVALID_NAME

我认为这有点滥用(因为确实应该有专门的功能),但它能够达到目的。


1
如果文件尚不存在,则情况不太好。同时,安全性可能会防止其访问,直到提升权限。 - CodeLurker
@CodeLurker 为什么不呢?OP只是想检查一个有效的Windows文件名/路径。 - klaus triendl
OP没有提到它是否已经存在。如果不存在,那些也不会有帮助。此外,即使我们(尚)无法访问它,我们也可能想要检查。请注意,我最终在这里解决的方案:https://dev59.com/Y3A75IYBdhLWcg3w6Nn8#45282192 - CodeLurker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接