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

ere*_*eOn 19 c++ filesystems validation 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
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?有一些Qt内置功能吗?

我想避免创建一个空文件,但如果没有其他可靠的方法,我仍然希望看到如何以"干净"的方式做到这一点.

非常感谢.

小智 22

这是我从Silje Johansen - 支持工程师 - Trolltech ASA(2008年3月)获得的答案

然而.包含区域设置和查找在Linux/Unix上查询文件系统的统一方法的复杂性几乎是不可能的.

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

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

Boost也没有解决问题,它们只给出了一些模糊的概念,即路径的最大长度,特别是如果你想要跨平台.据我所知,许多人尝试过并且未能解决这个问题(至少在理论上,实际上在大多数情况下编写一个创建有效文件名的程序是绝对可能的.

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

无效字符的并发症

文件系统限制与操作系统和软件限制之间的区别.Windows资源管理器,我认为是Windows操作系统的一部分,并不完全支持NTFS.包含':'和'?'等的文件可以很好地驻留在ntfs分区上,但资源管理器只会对它们进行扼流.除此之外,您可以安全地玩并使用Boost Filesystem的建议.

路径长度的并发症

boost页面未完全解决的第二个问题是完整路径的长度.可能目前唯一可以确定的是没有OS /文件系统组合支持不确定的路径长度.但是,诸如"Windows最大路径限制为260个字符"之类的语句是错误的.Windows中的unicode API允许您创建长达32,767 utf-16个字符的路径.我没有检查过,但是我想象资源管理器窒息同样专注,这会使这个功能对于拥有除你自己以外的任何用户的软件完全没用(另一方面你可能不希望你的软件合唱).

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

最后要提出建设性意见,以下是关于编写解决方案的可能方法的一些想法.

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

希望这给了一些见解.


Jos*_*ley 3

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

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

  • 注意 boost 不会检查无效名称(在 win 上),例如 com、lpt、aux 等 - 对于那些不记得 DOS 日期的人。 (4认同)