我在SO上找到了这段代码片段(抱歉,我没有问题/答案组合的链接)
bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) == FileAttributes.Directory;
这让我感到困惑,因为FileAttributes.Directory
的{{1}}位于==
。
&
在这种情况下做了什么?我不知道如何阅读这行代码。我正在尝试评估路径字符串是文件还是目录。
答案 0 :(得分:5)
它执行按位AND操作。属性存储为位标志,因此它和这些标志一起使用AttributeFlags.Directory来查看其中一个属性是.Directory。
Bit Flags的好例子: http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx
[Flags]
public enum FileAttributes
{
Archive, // 0000
Compressed, // 0001
Device, // 0010
Directory, // 0100
Encrypted, // 1000
...
}
然后:
File.GetAttributes(source): 1101
FileAttributes.Directory: 0100
(Logical AND): 0100
0100与目录标志相同,因此我们现在知道该标志位于枚举的所选标志中。
答案 1 :(得分:5)
使用位掩码来测试是否设置了单个位(FileAttributes.Directory)。
枚举的值是2的幂,对应于各个位。
ReadOnly = 1,
Hidden = 2,
System = 4,
Directory = 16,
Archive = 32,
Device = 64,
如果设置了ReadOnly和Directory,则FileAttributes等于17.计算结果如下所示:
File.GetAttributes(source) = 00001001
FileAttributes.Directory = 00001000 &
-------------------------------------
00001000
如果目录位不设置,则为零:
File.GetAttributes(source) = 00000001
FileAttributes.Directory = 00001000 &
-------------------------------------
00000000
一种稍微更简洁的方法来编写具有相同效果的表达式,即对零进行测试:
bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) != 0;
答案 2 :(得分:2)
这是logical & operator。在此特定示例中,它检查FileAttributes枚举是否具有Directory值,验证source
变量指向的字符串是否为目录。
答案 3 :(得分:1)
单身&是一个按位运算符。 http://msdn.microsoft.com/en-us/library/sbf85k1c(v=VS.100).aspx
它对两个值的各个位执行按位AND。它在位掩码中使用了很多。
答案 4 :(得分:1)
&
是一个按位and
运算符。
答案 5 :(得分:1)
它正在执行按位标记测试 - File.GetAttributes(source)
可以返回指示不同属性的标志(在不同位中)的数字。 &
将1
限制为仅 FileAttributes.Directory
中存在的那些(我希望这是一个位)。实际上,这是16
,即(二进制)..0001000
如果source
有ReadOnly
(= 1),Hidden
(= 2)和Directory
(= 16),则为:
...0001011
我们& 16岁
...0001000
离开
...0001000
因此目录测试传递。
如果源代码有System
(= 4)和ReadOnly
(= 1)(而不是目录),那么它将是:
...0000101
我们& 16岁
...0001000
离开
...0000000
因此目录测试失败。
作为旁注;此类测试中的==
验证是否设置了所有所需的标志(如果多个位在第二个操作数中)。另一个常见的测试是!= 0
,它测试是否存在任何位。
答案 6 :(得分:0)
它是按位运算符AND http://en.wikipedia.org/wiki/Bitwise_operation
codesnippet在两个变量之间执行按位AND,然后将该值与另一个变量进行比较,将结果放在一个bool中。
答案 7 :(得分:0)
按位AND
操作。 FileAttributes
是Flags enum。这意味着此枚举的数值中的每个位都描述了该文件的一些布尔属性,并且它们可以组合在一起。
答案 8 :(得分:0)
它正在测试FileAttributes.Directory
返回的枚举中是否设置了标志File.GetAttributes
。您可以在this entry on MSDN中详细了解如何使用标记枚举。
我正在尝试评估路径字符串是文件还是目录。
我宁愿使用System.IO中的一种方法,例如Directory.Exists
:
if (Directory.Exists(path))
{
// it's a directory
}
else if (File.Exists(path))
{
// it's a file
}
else
{
// doesn't exist
}
答案 9 :(得分:0)
GetAttributes返回一个标志值,其中每个位代表不同的布尔状态。此代码使用按位& operator,用于打开Directory标志,以及GetAttributes返回的任何其他标志。
这看起来过于复杂。这相当于写作:
bool isDir = File.GetAttributes(source).HasFlag(FileAttributes.Directory);
或者,专门测试Directory属性:
bool isDir = File.GetAttributes(source) == FileAttributes.Directory;
HasFlag()方法目前有点慢,因此按位替代方法更快,使用的资源更少。 HasFlag非常适合快速简单地响应标志中的所需位是打开还是关闭,而不知道位值或二进制文件。