我最近在stackoverflow上得到了一些很好的帮助.其中一个答案让我感到困惑,由于评论框的限制,我觉得不适合得到解释.
请查看以下代码.
if ((File.GetAttributes(fileName) & FileAttributes.Archive) == FileAttributes.Archive)
{
// Archive file.
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么你会在&之后包含逻辑(参见粗体)
(File.GetAttributes(fileName)&FileAttributes.Archive)==等
肯定FileAttributes.Archive == FileAttributes.Archive将始终匹配?
有没有人对此有解释(国际海事组织这可能是一个错字/错误,但我以前假设太多东西,以后才能纠正!)
第二个问题是~代码在此代码中的作用:
File.SetAttributes(fileName, File.GetAttributes(fileName) & ~FileAttributes.Archive);
Run Code Online (Sandbox Code Playgroud)
一些枚举是旗帜.也就是说,它可以包含枚举成员的任何组合,并且仍然有效.
在的情况下FileAttributes枚举,一个文件可以是ReadOnly与Hidden在同一时间.同样,文件可以是Hidden,ReadOnly和System.为每个组合写一个枚举成员会给16个不同的成员!非常低效.
使用flag-type枚举时,检查值是否包含指定枚举成员的方法是以按位(二进制)方式将其与自身进行比较.
鉴于FileAttributes枚举的以下简化定义:
[Serializable, Flags]
public enum FileAttributes
{
Archive = 32,
Hidden = 2,
Normal = 128,
ReadOnly = 1,
System = 4,
Temporary = 256
}
Run Code Online (Sandbox Code Playgroud)
一个System这也标志着文件ReadOnly将具有值5(4 + 1).尝试ReadOnly使用代码确定文件是否正确
File.GetAttributes(fileName) == FileAttributes.System
Run Code Online (Sandbox Code Playgroud)
将评估如下:
5 == 4
Run Code Online (Sandbox Code Playgroud)
结果将是False.
确定文件是否已System设置属性的最佳方法是对文件的属性和要确定其存在的属性执行二进制AND运算.在代码中,你会写这个:
(File.GetAttributes(fileName) & FileAttributes.System) == FileAttributes.System
Run Code Online (Sandbox Code Playgroud)
System在进行比较之前,这将除去属性之外的所有其他属性.在数学上它会评估如下:
0101 (System + Hidden)
AND 0100 (System)
-------- -----------------
0100 (System)
然后将result(0100)与System属性(0100)进行比较,然后得到结果True.
在一行中,代码将进行(0x0101 & 0x0100) == 0x0100评估True.
从.NET 4.0开始,Microsoft已经包含了Enum.HasFlag确定枚举值中是否存在标志的方法.因此,您不必自己键入所有代码.处理具有该Flags属性的Enum类型时,您只需使用该HasFlag方法检查是否存在特定标志.因此,您的行将被写为
File.GetAttributes(fileName).HasFlag(FileAttributes.System)
Run Code Online (Sandbox Code Playgroud)
波形符(~)标记,在一个数字值使用(或可被"退化"到任何类型的时int,uint,long或ulong),具有翻转的数量的位,产生所述数目的补(所有其它值以外的一个的影响指定).
例如,给定16位数字4(0x0100),它的补码(~4)将是11(0x1011)
0100 -> 1011
波浪号标记XOR与对比的类型的最高值具有相同的效果.对于16位数字,最高值为15(1111),因此您的代字号将评估为:
0100
XOR 1111
--------
1011
在你的代码的效果File.SetAttributes(fileName, File.GetAttributes(fileName) & ~FileAttributes.Archive)将因此获得该文件的属性,删除的Archive属性,然后将其设置回文件.
假设文件的属性是Archive + Hidden,它的值为34(0x00100010),~Archive其值为0x11011111.
评估将如此
(Archive + Hidden) 0x00100010
AND (~Archive) 0x11011111
---------------------- ----------
Hidden 0x00000010
文件的属性随后将更改为"仅隐藏"(将删除"归档"属性).
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |