类Linux系统下,无需双点用Ruby的Dir.mkdir/mkdir_p能否在工作目录外建文件夹?
问题解答
无需双点(..)也能在当前目录外创建文件夹
当然可以。只要传给Dir.mkdir或Dir.mkdir_p的是绝对路径(比如/tmp/my_app_data),完全不需要依赖..就能在当前工作目录之外创建文件夹。另外,如果你的目标路径是绝对形式的外部路径(比如当前目录是/home/me,直接传/home/you/new_dir),同样能成功创建,和..无关。
举个实际代码例子:
# 直接在/tmp下创建文件夹,与当前工作目录无关 Dir.mkdir_p("/tmp/user_uploads")
只要进程拥有对应目录的写入权限,这个操作就能顺利完成。
用户输入文件夹名的静默清理方案
要实现保留单个句点(用于扩展名)、移除波浪号(~)和控制字符的需求,用正则做过滤替换就能搞定,全程静默处理无需抛出错误。下面是具体实现思路和代码:
核心清理规则
- 彻底移除所有ASCII控制字符(范围
\x00-\x1F和\x7F) - 删除所有波浪号(~)
- 将连续句点(比如
file..pdf)合并为单个句点,避免无效文件名格式 - 兜底处理空字符串或仅含句点的情况,设置默认名称
代码实现
def sanitize_folder_name(raw_name) # 第一步:移除控制字符和波浪号 clean_name = raw_name.gsub(/[\x00-\x1F\x7F~]/, '') # 第二步:合并连续句点为单个 clean_name = clean_name.gsub(/\.+/, '.') # 第三步:兜底处理空值或纯句点的情况 clean_name = 'default_folder' if clean_name.empty? || clean_name == '.' clean_name end # 测试场景示例 puts sanitize_folder_name("my~docs..2024\x0B.pdf") # 输出 "mydocs.2024.pdf" puts sanitize_folder_name("~~invalid\x00name..") # 输出 "invalid.name" puts sanitize_folder_name("..") # 输出 "default_folder"
结合文件夹创建的完整流程
如果要处理完整路径(用户输入可能是相对路径或绝对路径),可以拆分路径与文件名,清理后再拼接:
def create_safe_folder(user_input) # 拆分路径的目录部分和文件名部分 parent_dir, folder_name = File.split(user_input) # 清理文件名 sanitized_name = sanitize_folder_name(folder_name) # 拼接成完整路径 target_path = File.join(parent_dir, sanitized_name) # 可选:强制转为绝对路径,避免歧义 target_path = File.expand_path(target_path) # 创建文件夹(mkdir_p自动创建不存在的父目录) Dir.mkdir_p(target_path) # 返回最终创建的路径 target_path end # 使用示例 create_safe_folder("./my~bad\x08name..dir")
额外提醒
即便做了输入清理,建议仍限制最终路径在你预期的根目录范围内(比如仅允许在/var/app/uploads下创建),防止用户输入绝对路径导致意外创建到系统目录。另外要确保进程拥有目标目录的写入权限,避免创建失败。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

