c++ - 创建一个安全的转义路径基/文件名,检查是否安全

标签 c++ windows linux boost filesystems

我想知道是否有一种通用方法来生成可移植的文件系统安全文件名。也就是说,我有一个用户输入了字符串,并且希望生成一个名称与他们选择的名称非常相似的文件。结果名称不得包含任何路径引用或其他特殊文件系统特殊名称或标记。

目前,我只是用其他字符或空字符串替换一堆已知的错误字符。例如,给定名称 ABC/DEF* : A Company?,我将生成字符串 ABC - DEF - A Company。我对替换字符的选择完全是任意的,因为我不知道通用转义符号。

所以我的相关问题是:

  1. 是否有一种方法(可能在 boost 文件系统中)可以告诉我该名称是否严格引用没有路径的文件?
  2. 是否有一个函数可以告诉我该名称是否可以“安全”用作文件(对于某些文件系统,这可能是从 1 开始的额外检查)?
  3. 是否有一个函数可以将字符串转换为合理的安全名称?

附加说明

对于#1,我想将 boost path::filename() 与原始对象进行比较,如果它们相同,那么我就有一个文件。然而,这仍然允许诸如“..”和“.”之类的内容。但如果 #2 有一个好的解决方案,那就没问题了

理论上,我必须提供文件所在的目录,因为不同的文件系统可能有不同的要求。但操作系统的全局解决方案也可以。

我已经有一个函数可以替换一堆常见的不安全字符。

公共(public)文件对话框不能用于进行过滤,因为界面可能并不总是允许它们,并且在某些情况下用户无法直接意识到与文件的关系(但是高级用户会)。

最佳答案

根据POSIX fully portable filenames ,唯一可移植的文件名是仅包含 A–Za–z0–9._- 且长度最多为 14 个字符的文件名。

也就是说,更实用的方法是假设现代文件系统可以处理更长的文件名,并简单地将所有未明确标记为“安全”的字符替换为 _。有时,这些字符不是用 _ 替换,而是进行十六进制编码,例如 URL:sample%20file.txtKDE例如,应用程序就使用它。

至于实现,就像s/[^A-Za-z0-9.-]/_/一样简单。

关于c++ - 创建一个安全的转义路径基/文件名,检查是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5746562/

相关文章:

linux - 消除 VirtualBox 上的 emacs 中的 "File changed on disk"警告

c++ - decltype、result_of 还是 typeof?

c++ - 为什么我无法使用 Code::Blocks C++ 读取文件?

c# - 使用 .NET 代码将系统时间同步到域 Controller

windows - 确定当前是否在 Windows 资源管理器中重命名文件

linux - 使用 Bash 计算今天和当月下一个重复日期之间的距离?

c++ - 创建顺序类对象

c++ - 使用已知模型系数在 pcl 中绘制多条线

c++ - 如何在 Windows 上使用 C++ 编程在电源故障时恢复数据

linux - for, do, done 在 linux 中应用将 txt 转换为 biom 格式