1

考虑下面的代码 -

 FileInfo fileInfo = new FileInfo("C:\\doesNotExist.txt");
 Console.WriteLine(fileInfo.Attributes);
 Console.WriteLine(fileInfo.Attributes.HasFlag(FileAttributes.ReadOnly));

根据文档,枚举的默认基础类型是int,而值为 -1 的 int 基本上是二进制的全 1 因为,FileAttributes 允许其成员值的按位组合(如此处所述),为什么 FileAttributes 的默认值是 -1,因为这意味着不存在的文件拥有所有可能的 FileAttributes(上面的代码第三个打印True线)

4

1 回答 1

1

这只是猜测,来源令人困惑,但看起来可能是这样,因此代码可以区分尚未初始化的数据 - 即默认为零的 int - 和已初始化但没有价值的数据,就像不存在的文件上的文件属性一样。

来自File.FillAttributeInfo 的源代码

// Returns 0 on success, otherwise a Win32 error code.  Note that
// classes should use -1 as the uninitialized state for dataInitialized.

然后如果找不到文件:

if (!returnErrorOnNotFound) {
    // Return default value for backward compbatibility
    dataInitialised = 0;
    data.fileAttributes = -1;
}

Exists期望调用者在访问属性之前检查 FileInfo 的属性是否为真似乎是合理的。

于 2016-09-05T13:31:40.237 回答