Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1071474
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 虚拟化

2012-03-13 17:56:16

今天抱着希望问了几个职业的程序员,问个文件类操作问题结果一个都回答不了,感觉就是胡言乱语,只好自己解决,网上也没有解释,于是就看了下CSDN的帮助,灵感一来就算是解决了,呵呵。这几日没时间学习程序,老师都安排我去听马克思哲学了,闲暇时间还要陪老婆聊天,今天算是学习文件操作的第一天,也就抽时间写个笔记,感觉.NET的IO命名空间下的文件操作类型是目前我遇到的几种语言中最丰富和简洁的所以很好学习,先画个文件类框架呗。

任何编程语言操作文件都要调用操作系统的应用程序接口来实现,.NET框架提供了功能强大的统一的应用程序接口,在System.IO命名空间下,定义了多种文件管理,文件和数据流读写的类型。

废话也就不多说了,我们来看下我参考微软的官方实例写的例子

using System;
using System.IO;

namespace 文件操作
{
class Test
{
static void Main(string[] args)
{

string file = @"D:\test1.txt";
if (!File.Exists(file))
{
File.Create(file);
}

else
{
try
{
if ((File.GetAttributes(file) & FileAttributes.Hidden) == FileAttributes.Hidden)
//如果文件被隐藏
{
File.SetAttributes(file, FileAttributes.Archive);
Console.WriteLine("文件不再被隐藏");
}
else //如果文件没有被隐藏
{
File.SetAttributes(file,File.GetAttributes(file)|FileAttributes.Hidden);
Console.WriteLine("文件被隐藏");
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.ReadKey();

}
}

}

代码简单的也没什么看的,就那个意思,主要解决下面一行代码的取值方法:

if (File.GetAttributes(file) & FileAttributes.Hidden) == FileAttributes.Hidden)

  这一句是怎么判断文件属性是否包含Hidden属性值,那么我们这里就来跟踪MSDN进行讲解下,大侠如有高见就给我留个言,我也学习一下。

1.File.GetAttributes 方法获取在此路径上的文件的 FileAttributes。

2.继续进入FileAttributes的解释:此枚举有一个 FlagsAttribute属性,允许其成员值按位组合。

3..我们再看FlagsAttribute属性:

只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义属性。

  • 用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。

请考虑为常用标志组合创建一个枚举常量。例如,如果用于文件 I/O 操作的枚举包含枚举常量 Read = 1 和 Write = 2,请考虑创建枚举常量 ReadWrite = Read OR Write,该常量组合了 Read 和 Write 标志。此外,在某些情况下,可能会将用于组合标志的按位 OR 运算视为一种高级概念,在简单任务中不需要执行此操作。

好了,总结一下就明白了,这里的 File.GetAttributes (file)返回的是一个枚举对象,FileAttributes.Hidden只是枚举内属性之一,我下面可以简单的举一个例子:

1 using System;
2
3 class FlagsAttributeDemo
4 {
5 enum Color1 : short
6 {
7 Black = 0,
8 Red = 1,
9 Green = 2,
10 Blue = 4
11 };
12
13 [FlagsAttribute]
14 enum Color2 : short
15 {
16 Black = 0,
17 Red = 1,
18 Green = 2,
19 Blue = 4
20 };
21
22 static void Main()
23 {
24 Console.WriteLine("测试未使用FlagsAttribute属性");
25 Color1 MyColor1 = Color1.Red | Color1.Blue & Color1.Green;
26 //我先不运行计算一下看看是那个:0001|0100&0010=0001 应该是Red
27 Console.WriteLine("MyColor1={0}", MyColor1);
28 Color1 MyColor_1 = Color1.Red | Color1.Blue;
29 //我先不运行计算一下看看是那个:0001|0100=0101 应该是5
30 Console.WriteLine("MyColor_1={0}",MyColor_1);
31 Console.WriteLine("测试使用FlagsAttribute属性");
32 Color2 MyColor2 = Color2.Red | Color2.Blue;
33 //我先不运行计算一下看看是那个:0001|0100=0101应该是Red,Blue
34 Console.WriteLine("MyColor2={0}", MyColor2);
35 Console.ReadKey();
36 }
37 }

运行结果如下:


有上面的代码很人以看出二进制位运算的,那么

if (File.GetAttributes(file) & FileAttributes.Hidden) == FileAttributes.Hidden)

是不是很简单了,File.GetAttributes(file) & FileAttributes.Hidden返回的应该就是FileAttributes.Hidden;因此就可以判断是否包含Hidden属性。

当然实在不懂,可以用集合的概念理解下还更方便(|对应于取并集,&对应于取交集) 简单的说这个就是(a|b)&b=b的问题。

OVER,老婆打电话来了.........................................

阅读(534) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~