使用 Qt 检查字符串是否是有效的文件名

新手上路,请多包涵

有没有办法用 Qt 4.6 检查给定的 QString 是否是当前操作系统上的有效文件名(或目录名)?我想检查名称是否有效, 而不是 检查文件是否存在。

例子:

 // Some valid names
test
under_score
.dotted-name

// Some specific names
colon:name // valid under UNIX OSes, but not on Windows
what? // valid under UNIX OSes, but still not on Windows

我将如何实现这一目标?是否有一些 Qt 内置功能?

我想避免创建一个空文件,但是如果没有其他可靠的方法,我仍然想看看如何以“干净”的方式来做。

非常感谢。

原文由 ereOn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

我不认为 Qt 有内置函数,但如果 Boost 是一个选项,您可以使用 Boost.Filesystem 的 name_check 函数

如果 Boost 不是一个选项,它关于 name_check 函数的页面仍然很好地概述了在各种平台上检查的内容。

原文由 Josh Kelley 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是我从 Silje Johansen - Support Engineer - Trolltech ASA 那里得到的答案(不过是在 2008 年 3 月)

然而。包括语言环境设置和找到一种统一的方法来查询 Linux/Unix 上的文件系统关于其功能的复杂性几乎是不可能的。

但是,据我所知,我所知道的所有应用程序都忽略了这个问题。

(阅读:他们不会实施它)

Boost 也不能解决问题,它们只给出了一些关于最大路径长度的模糊概念,特别是如果你想跨平台。据我所知,很多人都尝试过但未能解决这个问题(至少在理论上,在实践中,最有可能编写一个在 大多数情况下 创建有效文件名的程序。

如果您想自己实现它,可能值得考虑一些不那么明显的事情,例如:

无效字符的并发症

文件系统限制与操作系统和软件限制之间的区别。例如,我认为是 Windows 操作系统的一部分的 Windows 资源管理器并不完全支持 NTFS。包含 ‘:’ 和 ‘?’ 等的文件可以愉快地驻留在 ntfs 分区上,但资源管理器只会扼杀它们。除此之外,您可以放心使用 Boost Filesystem 的建议。

路径长度的并发症

提升页面未完全解决的第二个问题是完整路径的长度。可能目前唯一可以确定的是没有操作系统/文件系统组合支持无限的路径长度。但是,诸如“Windows 最大路径限制为 260 个字符”之类的陈述是错误的。 Windows 的 unicode API 允许您创建最长 32,767 个 utf-16 字符的路径。我还没有检查过,但我认为 Explorer 会同样投入使用,这将使该功能对于拥有除您自己以外的任何用户的软件完全无用(另一方面,您可能更希望不要让您的软件在合唱中窒息)。

存在一个名为 PATH_MAX 的旧变量,这听起来很有希望,但问题是 PATH_MAX 根本不是.

以建设性的注释结束,这里有一些关于编写解决方案的可能方法的想法。

  1. 使用定义来制作操作系统特定的部分。 ( Qt 可以帮助你
  2. 使用 boost 页面和操作系统和文件系统文档上给出的建议来决定你的非法字符
  3. 对于路径长度,我想到的唯一可行的想法是二叉树试验一种错误方法,使用系统调用的错误处理来检查有效的路径长度。这是相当冷漠的,但可能是在各种系统上获得准确结果的唯一可能性。
  4. 擅长优雅的错误处理。

希望这提供了一些见解。

原文由 user1115652 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题