System.IO.Directory.CreateDirectory - 有史以来最奇怪的异常

System.IO.Directory.CreateDirectory - weirdest exception ever

所以,我正在尝试创建以下目录:

d:\temp\ak\ty\nul

Path是在循环中构建的,从:d:\temp等开始,一路创建不存在的目录,所以首先创建:

d:\temp\ak

然后:

d:\temp\ak\ty

and.... 然后到了最后一位 nul 它抛出这个异常:

那么,发生了什么事 - \.\nul 从哪里来的?

代码:

string z_base_path = @"d:\temp\ak\ty";
string z_extra_path = "nul";
string z_full_path = System.IO.Path.Combine(z_base_path, z_extra_path);

System.IO.Directory.CreateDirectory(z_full_path);

'nul' 是一个设备文件,这意味着没有 file/folder 可以具有该名称。 而不是

string z_extra_path = "nul";

尝试

string z_extra_path = "null";

string z_extra_path = "";

其他的是
  • con
  • aux
  • com1-9
  • lpt1-9
  • prn

在Windows中,nul为保留文件名。任何文件或目录都不能这样命名。其他保留名称包括:

  • con
  • prn
  • aux
  • com{0-9}
  • lpt{0-9}

直到我反对它才知道这个 - Windows 目录保留名称和所有其他名称一文不值。

摘自关于文章: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file

文件夹命名约定

无论文件系统如何,以下基本规则使应用程序能够创建和处理文件和目录的有效名称:

在目录或文件名中使用句点分隔基本文件名和扩展名。

使用反斜杠 () 分隔路径的组成部分。反斜杠将文件名与其路径分开,并将一个目录名与路径中的另一个目录名分开。您不能在实际文件或目录的名称中使用反斜杠,因为它是将名称分隔成组件的保留字符。

根据需要使用反斜杠作为卷名的一部分,例如“C:\path\file”中的“C:”或“\server\share”中的“\server\share” \path\file" 用于通用命名约定 (UNC) 名称。有关 UNC 名称的详细信息,请参阅最大路径长度限制部分。

不区分大小写。例如,考虑名称 OSCAR、Oscar 和 oscar 是相同的,即使某些文件系统(例如 POSIX-compliant 文件系统)可能认为它们不同。请注意,NTFS 支持区分大小写的 POSIX 语义,但这不是默认行为。有关详细信息,请参阅 CreateFile。

卷指示符(驱动器号)类似地 case-insensitive。例如,“D:”和“d:”指的是同一卷。

使用当前代码页中的任何字符作为名称,包括 Unicode 字符和扩展字符集 (128–255) 中的字符,但以下字符除外:

以下保留字符:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
Integer value zero, sometimes referred to as the ASCII NUL character.

整数表示在 1 到 31 范围内的字符,允许使用这些字符的备用数据流除外。有关文件流的详细信息,请参阅文件流。

目标文件系统不允许的任何其他字符。

在路径中使用句点作为目录组成部分来表示当前目录,例如“.\temp.txt”。有关详细信息,请参阅路径。

在路径中使用两个连续的句点(..)作为目录组成部分,表示当前目录的父目录,例如“..\temp.txt”。有关详细信息,请参阅路径。

不要使用以下保留名称作为文件名:

CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9。还要避免这些名称后跟扩展名;例如,不推荐 NUL.txt。有关详细信息,请参阅名称spaces。

不要以 space 或句点结束文件或目录名。虽然底层文件系统可能支持这样的名称,但 Windows shell 和用户界面不支持。但是,可以将句点指定为名称的第一个字符。例如,“.temp”。