创建一个安全的,转义的路径基/文件名,检查是否安全
Create a safe, escaped path base/file name, check if safe
我想知道是否有一种通用的方法来生成可移植的文件系统安全文件名。也就是说,我有一个用户输入的字符串,并希望生成一个名称与用户选择的名称非常相似的文件。生成的名称不能包含任何路径引用或其他特殊的文件系统特殊名称或标记。
目前我只是用其他字符或空字符串替换一堆已知的坏字符。例如,给定名称ABC / DEF* : A Company?
,我将生成字符串ABC - DEF - A Company
。我对替换字符的选择完全是任意的,因为我不知道通用的转义符号。
所以我的相关问题是:
- 是否有一种方法(也许在boost文件系统),可以告诉我,如果名称严格指一个文件没有路径?
- 是否有一个函数告诉我名称是否"安全"用作文件(对于某些文件系统,这可能是1的额外检查)?
- 是否有一个函数将字符串转换为合理的安全名称?
额外笔记添加
对于#1,我想只是比较一个boost路径::filename()与原始对象,如果它们是相同的,那么我有一个文件。然而,这仍然允许诸如"……'和'。'但如果#2有一个好的解决方案,那就没问题了
理论上我必须提供一个存放文件的目录,因为不同的文件系统可能有不同的要求。但是,为操作系统提供一个全球性的解决方案也是可以的。
我已经有了一个函数,它只是替换了一堆众所周知的不安全字符。
普通文件对话框不能用于过滤,因为界面可能并不总是允许这样做,而且在某些情况下,用户并不直接意识到与文件的关系(高级用户会)。
根据POSIX完全可移植文件名,唯一可移植的文件名是那些只包含A–Za–z0–9._-
且最长14个字符的文件名。
也就是说,更实际的方法是假设现代文件系统可以处理更长的文件名,并简单地用_
替换所有未显式标记为"安全"的字符。有时,这些字符不是用_
替换,而是十六进制编码,例如url: sample%20file.txt
。例如,KDE应用程序使用它。
至于实现,就像s/[^A-Za-z0-9.-]/_/
一样简单。
便携有多便携?许多系统对长度有限制,有些可能现在还会。区分名字是个问题吗?一些系统可以区分情况,而其他系统则不能。最后的.xxx
呢?对于某些系统,它是重要的,对于其他系统,它只是文本。
忽略长度,最安全的做法是采取相反的方法:创建一组已知的安全字符,并将外部的所有内容转换为这是一个特定的角色。ASCII字母数字,和'_'
似乎相当安全,你可能(今天)可以使用'-'
,但我怀疑这个列表要远得多。这取决于你用这些做什么名称,您可能希望将它们强制为单一大小写,大写或小写低。
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 从命令行c++发送文本文件名
- 虚拟决赛作为安全
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 全局变量 多读取器 一个写入器多线程安全?
- 创建一个安全的,转义的路径基/文件名,检查是否安全
- 将URL编码为安全的文件名字符串