我想知道是否有一种通用的方式来生成可移植的文件系统安全文件名。 也就是说,我有一个用户input的string,并希望生成一个名称与其所选名称非常相似的文件。 结果名称不得包含任何path引用或其他特殊文件系统专用名称或标记。
目前我只是用其他字符或空stringreplace一堆已知的坏字符。 例如,给定名称ABC / DEF* : A Company?
我会产生stringABC - DEF - A Company
。 我replace字符的select完全是任意的,因为我不知道一个通用的转义符号。
所以我相关的问题是:
附加说明
对于#1,我想只比较一个boost path :: filename()到原始对象,如果它们是相同的,那么我有一个文件。 但是,这仍然允许像'..'和'。 但是,如果对于#2有一个好的解决scheme,这可能是好的
理论上我必须提供一个文件所在的目录,因为不同的文件系统可能有不同的要求。 但是OS的全球解决scheme也可以。
我已经有一个函数,只是取代了一堆众所周知的不安全的字符。
常用的文件对话框不能用来做过滤,因为界面可能并不总是允许它们,在某些情况下,用户并没有直接意识到与文件的关系(高级用户会这样做)。
根据POSIX完全可移植的文件名 ,唯一的可移植文件名是那些只包含A–Za–z0–9._-
文件名 , A–Za–z0–9._-
14个字符。
也就是说,更实际的方法是假设现代文件系统可以处理更长的文件名,并简单地用_
替换所有未明确标记为“安全”的字符。 有时候,这些字符不是用_
替换,而是用十六进制编码,如URL: sample%20file.txt
。 例如, KDE应用程序使用它。
至于实现,就像s/[^A-Za-z0-9.-]/_/
。
移动便携性如何? 许多系统的长度有限制,有些可能仍然有效。 名字之间的争议是否令人讨厌? 有些系统区分情况,其他系统则不行。 那最后的.xxx
呢? 对于某些系统来说,对其他系统来说,这只是文本。
忽略长度,最安全的方法是采取相反的方法:创建一组已知的安全字符,并将其外的所有内容转换为特定的字符。 ASCII字母数字和'_'
看起来相当安全,你可能(今天)使用'-'
,但是我怀疑这个列表是否更进一步。 根据你对这些名字所做的事情,你可能想要强制他们到一个单一的案例,无论是上限还是下限。