qua*_*els 5 c# syntax bit-manipulation operators bitwise-operators
我在SO上找到了这个代码片段(抱歉,我没有问题/答案组合的链接)
bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) == FileAttributes.Directory;
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为FileAttributes.Directory它在两边都有==.
&在这种情况下做什么?我不知道如何阅读这行代码.我正在尝试评估路径字符串是文件还是目录.
它做一个按位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
...
}
Run Code Online (Sandbox Code Playgroud)
然后:
File.GetAttributes(source): 1101
FileAttributes.Directory: 0100
(Logical AND): 0100
Run Code Online (Sandbox Code Playgroud)
0100与目录标志相同,因此我们现在知道该标志位于枚举的所选标志中.
它使用位掩码来测试是否设置了单个位(FileAttributes.Directory).
枚举的值是2的幂,对应于各个位.
ReadOnly = 1,
Hidden = 2,
System = 4,
Directory = 16,
Archive = 32,
Device = 64,
Run Code Online (Sandbox Code Playgroud)
如果设置了ReadOnly和Directory,则FileAttributes等于17.计算在二进制文件中如下所示:
File.GetAttributes(source) = 00001001
FileAttributes.Directory = 00001000 &
-------------------------------------
00001000
Run Code Online (Sandbox Code Playgroud)
如果没有设置目录位,则会得到零:
File.GetAttributes(source) = 00000001
FileAttributes.Directory = 00001000 &
-------------------------------------
00000000
Run Code Online (Sandbox Code Playgroud)
编写表达式以获得相同效果的稍微简洁的方法是测试零:
bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) != 0;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |