C#中含NUL的文件路径触发DirectoryNotFoundException异常问题
解决Windows路径中包含NUL导致的DirectoryNotFoundException问题
这个问题的核心原因其实很直白:NUL是Windows系统的保留设备名称,系统会把它识别为内置设备而非普通的文件夹/文件。所以当你尝试创建包含NUL作为目录名的路径时,系统根本不会把它当作常规目录处理,自然就会抛出找不到目录的异常——毕竟系统找不到这个“设备目录”。
除了NUL,Windows还有一系列这类保留名称,比如CON、PRN、AUX、COM1到COM9、LPT1到LPT9等等,这些名称都不能单独作为路径中的目录或文件名使用。
解决方案
替换路径中的保留名称
既然文件名是从Excel读取的,你需要先对读取到的路径/文件名做预处理,把NUL替换成其他合法的名称,比如NUL_或者NULL,确保路径中没有系统保留的设备名。代码示例(添加预处理逻辑)
你可以加一个简单的替换逻辑,在创建文件之前处理路径:// 处理路径中的Windows保留设备名 string processedPath = filePathAndName.Replace("NUL", "NUL_"); FileInfo file = new System.IO.FileInfo(processedPath); file.Directory.Create(); File.WriteAllText(processedPath, headers + singleOption.Value);如果需要覆盖更多保留名称,可以扩展一个方法来批量替换:
private string SanitizeWindowsPath(string path) { string[] reservedNames = { "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" }; foreach (var name in reservedNames) { // 替换路径中单独作为目录/文件名的保留名(可根据实际情况调整匹配逻辑) path = path.Replace($@"\{name}\", $@"\{name}_\"); path = path.Replace($@"\{name}.", $@"\{name}_"); } return path; }然后在代码中调用这个方法:
string sanitizedPath = SanitizeWindowsPath(filePathAndName); FileInfo file = new System.IO.FileInfo(sanitizedPath); file.Directory.Create(); File.WriteAllText(sanitizedPath, headers + singleOption.Value);验证Excel数据源
虽然你用LEN([Cell])检查过没有隐藏字符,但还是可以确认一下Excel中的NUL是否是有意设置的标识,是否可以直接在源数据中替换,从根源避免这个问题。
内容的提问来源于stack exchange,提问作者YesThisIsMe
相关产品推荐
相关产品推荐

