【问题标题】:Check file name is valid windows name检查文件名是有效的窗口名称
【发布时间】:2011-03-06 08:13:59
【问题描述】:

我想检查我的字符串是否是有效的 Windows 文件路径。我四处寻找,似乎没有可靠的方法可以做到这一点。我还检查了 boost 文件系统库,没有明显的函数来做这个检查,可能是 is_valid_windows_name 之类的东西

【问题讨论】:

  • 是否需要检查提供的路径是否刚刚有效,或者是否有效以及是否已经为路径设置了目录结构,或者那里是否已经存在文件?
  • 好悲痛。这不是重复的,因为另一个标记为 C#,并且接受的答案给出了 C# API,而这个标记为 C++。
  • 尝试在 Windows 上创建一个具有该名称的文件,看看是否成功? (也许您可以稍微更改路径以供试用。)

标签: c++ windows file filesystems


【解决方案1】:

您可以使用_splitpath() 函数并解析输出(基于它,您可以轻松判断您的路径是否有效)。

有关更多信息,请参阅MSDN

请注意,此功能是特定于 windows 的。

【讨论】:

    【解决方案2】:

    我不相信有一个标准的 c++ api。

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

    你应该看看 windows shell api。

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

    最简单的方法是禁止

    \ / | " : ? *

    你应该没事的。

    【讨论】:

      【解决方案3】:

      是的,有一个增强功能可以满足您的需求。看看 boost::filesystem::windows_name(...)。您将需要包含 boost/filesystem/path.hpp 以及针对正确(特定于版本和体系结构的)libboost_system 和 libboost_filesystem 库的链接,因为 path 不是仅标头库。

      【讨论】:

      • Boost 如果这是它唯一的用途,可能会有点多,但 Boost 提供了许多下一代 C++ 功能,使其值得用于一般 C++ 开发。如果您已经使用 Boost,这是一个不错的选择。
      【解决方案4】:

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

      您可以使用特定于 Windows 的 Shell Lightweight Utility function PathFileExistsWindows API GetFileAttributes 并专门针对 ERROR_INVALID_NAME 检查最后一个错误代码。

      我认为这是一种误用(因为它确实应该有一个专门的功能)但可以达到目的。

      【讨论】:

      • 如果该文件尚不存在,那就不太好。此外,安全性可能会阻止其访问,直到提升。
      • @CodeLurker 为什么不完全正确? OP 只想检查有效的 Windows 文件名/路径
      • OP 没有说它已经存在。如果没有,那些将无济于事。此外,即使我们(还)没有访问权限,也可能是我们想要检查的情况。请注意我最终确定的解决方案:stackoverflow.com/questions/3038351/…
      猜你喜欢
      • 2020-08-20
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多