Arduino SD库目录命名疑问:含特殊字符的日期目录创建失败
SD.mkdir() 创建含多特殊字符目录失败的原因与解决办法
这问题我之前帮朋友排查过,其实核心是SD库(尤其是Arduino常用的SD库)背后遵循FAT文件系统的命名规则,不是单纯看特殊字符的数量——单个特殊字符可能刚好在允许范围内,但多个特定组合(比如你用的日期格式里的两个点)或者不符合FAT规范的命名会直接被拒绝。
关键规则:FAT32的目录命名限制
SD卡一般用FAT32格式,它对目录/文件名的硬限制包括:
- 绝对不能包含这些字符:
/ \ : * ? " < > | - 传统的8.3命名规则(SD库底层很多时候会遵循这个):最多8个主名字符 + 1个点 + 3个扩展名,超过这个结构或者多加点都会出问题
- 不能以点开头或结尾(系统自带的
./..除外,自定义目录不能这么用)
你用的11.03.24有两个点,完全不符合8.3的结构,所以SD.mkdir()直接判定为无效命名,返回false。而单个@是FAT允许的特殊字符,所以@/fasdaf/能创建成功,这就解释了你的测试结果。
你的测试验证刚好对应规则
你说测试编号1-5、7的目录都创建成功,只有带多个特殊字符的失败,移除后正常——这完全符合FAT规则:
- 单个特殊字符(比如
@)在允许列表里,所以能过 - 多个点的命名违反了8.3结构,被SD库拦截
解决办法:调整日期目录的命名格式
如果要创建日期格式的目录,换个符合规则的写法就行:
- 把点换成下划线:
11_03_24,这完全符合FAT规范,SD.mkdir("11_03_24")肯定能成功 - 用连字符替代:
11-03-24,连字符也是FAT允许的合法字符 - 要是非得保留点,只能用单个点的格式(比如
1103.24),但这可能不符合你展示日期的需求
额外排查技巧
要是以后再遇到类似问题,可以打印SD库的错误信息来精准定位:
if (!SD.mkdir("11.03.24")) { Serial.print("Error code: "); Serial.println(SD.errorCode()); Serial.print("Error message: "); Serial.println(SD.errorMessage()); }
这些信息能直接告诉你是命名无效还是其他问题(比如卡没插好、权限问题)。
内容的提问来源于stack exchange,提问作者Silviu Grumazescu
相关产品推荐
相关产品推荐

