使用无效路径创建目录,结果随盘符不同出现异常
盘符后缺反斜杠导致目录创建位置不一致的原因
在创建目录时如果忘记在盘符冒号后添加反斜杠(比如写成C:Temp\MyTest而非C:\Temp\MyTest),操作不会报错,但实际创建的目录位置可能和预期不符。通过以下C#代码测试可以看到,当前目录和盘符的不同会导致无效路径创建的目录位置不一致:
using System.IO; private static void CreateWrongDirectory() { var falseCPath = @"C:Temp\MyTest"; var falseDPath = @"D:Temp\MyTest"; var currentDirectoryD = @"D:\Temp\CurrentDirectory"; Directory.CreateDirectory(currentDirectoryD); Directory.SetCurrentDirectory(currentDirectoryD); Console.WriteLine($"Working Directory: {Directory.GetCurrentDirectory()}"); Console.WriteLine(); Console.WriteLine($"Trying to create \"{falseCPath}\""); var di = Directory.CreateDirectory(falseCPath); Console.WriteLine($"Created \"{di.FullName}\""); di.Delete(); Console.WriteLine($"Trying to create \"{falseDPath}\""); di = Directory.CreateDirectory(falseDPath); Console.WriteLine($"Created \"{di.FullName}\""); di.Delete(); Console.WriteLine(); var currentDirectoryC = @"C:\Temp\CurrentDirectory"; Directory.CreateDirectory(currentDirectoryC); Directory.SetCurrentDirectory(currentDirectoryC); Console.WriteLine($"Working Directory: {Directory.GetCurrentDirectory()}"); Console.WriteLine(); Console.WriteLine($"Trying to create \"{falseCPath}\""); di = Directory.CreateDirectory(falseCPath); Console.WriteLine($"Created \"{di.FullName}\""); di.Delete(); Console.WriteLine($"Trying to create \"{falseDPath}\""); di = Directory.CreateDirectory(falseDPath); Console.WriteLine($"Created \"{di.FullName}\""); di.Delete(); }
输出结果:
Working Directory: D:\Temp\CurrentDirectory Trying to create "C:Temp\MyTest" Created "C:\Temp\MyTest" Trying to create "D:Temp\MyTest" Created "D:\Temp\CurrentDirectory\Temp\MyTest" Working Directory: C:\Temp\CurrentDirectory Trying to create "C:Temp\MyTest" Created "C:\Temp\CurrentDirectory\Temp\MyTest" Trying to create "D:Temp\MyTest" Created "D:\Temp\MyTest"
这种现象的核心原因是Windows系统对X:XXX格式路径的特殊解析规则,这类路径属于「驱动器相对路径」,解析逻辑完全依赖当前进程的活动驱动器:
- 当路径中的盘符与当前工作目录所在的驱动器一致时,系统会将该路径解析为「当前工作目录 + 后续子路径」,比如当前目录在
D:\Temp\CurrentDirectory时,D:Temp\MyTest会被解析为D:\Temp\CurrentDirectory\Temp\MyTest - 当路径中的盘符与当前工作目录所在的驱动器不一致时,系统会默认将该路径解析为「对应盘符的根目录 + 后续子路径」,比如当前目录在
D:\Temp\CurrentDirectory时,C:Temp\MyTest会被解析为C:\Temp\MyTest
简单来说就是:
- 写和当前驱动器相同的盘符且不带反斜杠,路径会「挂靠」在当前工作目录下
- 写其他驱动器的盘符且不带反斜杠,路径会直接从该驱动器的根目录开始
这就导致了测试中看到的,切换当前目录所在驱动器后,相同的无效路径会创建到不同位置的现象。
内容的提问来源于stack exchange,提问作者Lemmes
相关产品推荐
相关产品推荐

