C# 文件IO流

原文文章:点这里

一、文件系统

1、文件系统类的介绍

  文件操作类大都在 System.IO 命名空间里。FileSystemInfo 类是任何文件系统的基类;FileInfo 与 File 表示文件系统中的文件;DirectoryInfo 与 Directory 表示文件系统中的文件夹;Path 表示文件系统中的路径;DriveInfo 提供对由关驱动器的信息访问。XXXInfo 与 XXX类的区别是:XXX是静态类,XXXInfo 类可以实例化。

  还有个较为特殊的类 System.MarshalByRefObject 语序在支持远程处理的应用程序中跨应用程序域边界访问对象。

2、FileInfo 与 File 类

复制代码
 1         static void FIleIfoAndFile()
 2         {
 3             // 创建文件
 4             FileInfo file = new FileInfo(@"D:\Document\Test\FileInfoAndFile.txt");
 5             Console.WriteLine("创建时间:"+file.CreationTime);
 6             Console.WriteLine("路径:"+file.DirectoryName);
 7             StreamWriter sw = file.AppendText();    // 打开追加流
 8             sw.Write("Xunzf");  // 追加数据
 9             sw.Dispose();   // 释放资源,关闭文件
10             File.Move(file.FullName, @"D:\Document\Test1\FileInfoAndFile.txt"); // 移动
11             Console.WriteLine("完成!");
12             Console.Read();
13             //文件已经存在的话不会创建,还是以前的文件存在,追加数据保留。
14             //移动文件目标路径已经存在该文件的话,移动失败,报异常
15         }
复制代码

3、DirectoryInfo 与 Directory类

复制代码
 1         static void DirectoryInfoAndDirectory()
 2         {
 3             //创建文件夹
 4             DirectoryInfo directory = new DirectoryInfo(@"D:\Document\Test2");
 5             directory.Create();
 6             Console.WriteLine("父文件夹:"+directory.Parent.FullName);
 7             //输出父目录下的所有文件与文件夹
 8             FileSystemInfo[] files = directory.Parent.GetFileSystemInfos();
 9             foreach (FileSystemInfo fs in files)
10             {
11                 Console.WriteLine(fs.Name);
12                 Console.WriteLine(fs.FullName);
13                 Console.WriteLine();
14             }
15             Directory.Delete(directory.FullName);//删除文件夹
16             Console.WriteLine("完成!");
17             Console.Read();
18             //已经存在要创建的目录,不会出错
19         }
复制代码

4、Path 类

复制代码
 1         static void PathTest()
 2         {
 3             Console.WriteLine(Path.Combine(@"D:\Document",@"Test\Test.txt"));   //连接
 4             Console.WriteLine("平台特定的字符:"+Path.DirectorySeparatorChar);
 5             Console.WriteLine("平台特定的替换字符:"+Path.AltDirectorySeparatorChar);
 6             Console.WriteLine("Path.PathSeparator:"+Path.PathSeparator);
 7             Console.WriteLine("Path.VolumeSeparatorChar:" + Path.VolumeSeparatorChar);
 8             Console.Read();
 9             // 以上四个依次是: \\   /   ;   :
10             // Combine方法最多支持4个路径组合,第二个是 \ 开头时,会直接使用第二个
11         }
复制代码

5、DriveInfo类

复制代码
 1         static void DriveInfoTest()
 2         {
 3             DriveInfo[] drives = DriveInfo.GetDrives();
 4             foreach (DriveInfo item in drives)
 5             {
 6                 if (item.IsReady)
 7                 {
 8                     Console.WriteLine("总容量:"+item.TotalFreeSpace);
 9                     Console.WriteLine("可用容量:"+item.AvailableFreeSpace);
10                     Console.WriteLine("驱动器类型:"+item.DriveFormat);
11                     Console.WriteLine("驱动器的名称:"+item.Name+"\n");
12                 }
13             }
14             Console.WriteLine("完成!");
15             Console.Read();
16         }
复制代码

 

二、文件操作

1、移动、复制、删除文件

复制代码
 1         static void MoveDeleteCopy()
 2         {
 3             string path = @"D:\Document\Test\Test.txt";
 4             File.WriteAllText(path, "测试数据");
 5             Console.WriteLine("文件已创建,请查看!");
 6             Console.ReadLine();
 7             File.Move(path, @"D:\Document\Test.txt");
 8             Console.WriteLine("移动完成,请查看!");
 9             Console.ReadLine();
10             File.Copy(@"D:\Document\Test.txt", path);
11             Console.WriteLine("文件已复制,请查看!");
12             Console.ReadLine();
13             File.Delete(path);
14             File.Delete(@"D:\Document\Test.txt");
15             Console.WriteLine("文件已删除,请查看!\nOK!");
16             Console.Read();
17         }
复制代码

2、判断是文件还是文件夹

1     string path = “需要判断文件的路径”;
2     Directory.Exists(path);
3     File.Exists(path);
4     //返回值为bool值

 

三、读写文件与数据流

1、读文件

复制代码
 1         static void ReadFile()
 2         {
 3             string path = @"D:\Document\Test\aa.txt";
 4             byte[] b = File.ReadAllBytes(path);
 5             Console.WriteLine("ReadAllBytes读二进制:");
 6             //for(byte i = 0; i < b.Length; i++)
 7             //{
 8             //    Console.Write((char)b[i]);
 9             //}
10             foreach (byte temp in b)
11             {
12                 Console.Write((char)temp);
13             }
14             string[] s = File.ReadAllLines(path, Encoding.UTF8);
15             Console.WriteLine("\nReadAllLines读所有行:");
16             foreach (string temp in s)
17             {
18                 Console.WriteLine("行:" + temp);
19             }
20             string str = File.ReadAllText(path, Encoding.UTF8);
21             Console.WriteLine("ReadAllText读所有行:\n" + str);
22             Console.Read();
23         }
复制代码

这个操作弄了很久,在一开始二进制都出来后使用的是:Console.Write((char)temp+“ ”);然后就神奇的发现第一行的首字母消失了,调试发现确实已经读到了该字节,而且一步一步进行也是打印出来了,但是换行的时候就发现消失了。一开始以为迭代器问题,换了for循环发现果然没问题了,但是还是有点不对劲,把输出后面的那一小段空格去点以后发现,就显示了,这个应该就是Console.Write方法的问题,跳到前面把首字母遮住了。

时隔一天,发现这个问题所在了,就是后面加上的 “ ” 这个空格的问题,二进制读取文件会依次读取文件中的每个符号,当读到第一行我们认为最后一个字符时,其实后面还有两个字符,分别是 ‘\r' 和 ’\n‘ 回车和换行符。问题就出在这两个字符身上,读到回车符时,它是直接返回本行的开头,所以紧接着的这个空格就把我的首个字母给遮住了,读下一个字符 换行 后,换行,开头就是一个空格,所以接下来这行的同样操作就不会遮住这个首字母。让我一眼看上去以为就第一个字母少了。

2、写文件

复制代码
 1         static void WriteFile()
 2         {
 3             string path = @"D:\Document\Test\Test.txt";
 4             File.WriteAllBytes(path, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });//写入二进制
 5             Console.WriteLine("WriteAllBytes写入二进制成功");//乱码
 6             Console.ReadLine();
 7             string[] array = { "123", "456", "7890" };
 8             File.WriteAllLines(path, array, Encoding.UTF8);//写入所有行
 9             Console.WriteLine("WriteAllLines写入所有行成功");
10             Console.ReadLine();
11             File.WriteAllText(path, "abcbefghijklmn", Encoding.UTF8);//写入字符串
12             Console.WriteLine("WriteAllText写入字符串成功\nOK!");
13             Console.Read();
14         }
复制代码

二进制写入后,全是乱码,用二进制再去读,也一样是乱码。

3、数据流

最常用的流如下:

  FileStream:    文件流,可以读写二进制文件。

  StreamReader:   流读取器,使其以一种特定的编码从字节流中读取字符。

  StreamWriter:     流写入器,使其以一种特定的编码向流中写入字符。

  BufferedStream:    缓冲流,给另一流上的读写操作添加一个缓冲层。

数据流类的层次结构:

 

 

4、使用 FileStream 读写二进制文件

复制代码
 1         static void FileStreamRW()
 2         {
 3             string path = @"D:\Document\Test\Test.txt";
 4             //以写文件的方式创建文件,文件已存在的话会报异常
 5             FileStream file = new FileStream(path, FileMode.CreateNew, FileAccess.Write);
 6             Console.WriteLine("创建文件");
 7             Console.Read();
 8             string str = "测试文件--Xunzf";
 9             byte[] bytes = Encoding.UTF8.GetBytes(str);
10             file.Write(bytes, 0, bytes.Length);//写入二进制
11             file.Dispose();
12             Console.WriteLine("写入数据成功!!!");
13             Console.ReadLine();
14             //以读文件的方式打开文件
15             file = new FileStream(path, FileMode.Open, FileAccess.Read);
16             byte[] temp = new byte[bytes.Length];
17             file.Read(temp, 0, temp.Length);//读取二进制
18             Console.WriteLine("读取数据:" + Encoding.UTF8.GetString(temp));
19             file.Dispose();
20             Console.Read();
21         }
复制代码

首先,FileMode,FileAccess都是枚举类型

一:FileMode,指定操作系统打开文件的方式

1)FileMode.CreateNew:
用法:创建新的文件,如果文件已存在,则会抛出异常。

2)FileMode.Create:
用法:创建新的文件,如果文件已存在,则覆盖;如果文件不存在,则创建新的。

3)FileMode.Open:
用法:打开文件,如果文件不存在,则会抛出异常。

4)FileMode.OpenOrCreate:
用法:打开或者新建文件夹,如果文件存在,则打开文件,把指针指到文件的开始;如果文件不存在,则新建文件。

5)FileMode.Truncate:
用法:如果文件存在,则打开文件,清除这个文件中的内容,把指针指到文件的开始,保留最初文件的创建日期(重写);如果文件不存在,则抛出异常。

6)FileMode.Append:
用法:追加,如果文件存在,则打开文件,把指针指到文件的末尾;如果文件不存在,则新建文件。

二:FileAccess,访问权限(只读,只写,可读可写)

1)FileAccess.Read:
用法:获得对文件的读取访问权限,进而可以从文件中读取数据(只读)。

2)FileAccess.Write:
用法:获得对文件的写入访问权限,进而可以将数据写入该文件(只写)。

3)FileAccess.ReadWrite:
用法:获得读取,写入文件的访问权限, 进而可以从文件中读取,写入数据(可读可写)。
FileMode,FileAccess 原文链接:点这里

 

5、StreamWriter 与 StreamReader

复制代码
 1         static void StreamWiterAndStreamReader()
 2         {
 3             string path = @"D:\Document\Test\Test.txt";
 4             //以写文件的方式创建文件
 5             FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write);
 6             StreamWriter sw = new StreamWriter(file);
 7             sw.WriteLine("测试文件--Xunzf");
 8             sw.Dispose();
 9             Console.WriteLine("写入数据成功!!!");
10             Console.ReadLine();
11             //以读文件的方式打开文件
12             file = new FileStream(path, FileMode.Open, FileAccess.Read);
13             StreamReader sr = new StreamReader(file);
14             Console.WriteLine("读取数据:" + sr.ReadToEnd());
15             sr.Dispose();
16             Console.Read();
17         }
复制代码

 

四、映射内存的文件

1、MemoryMappedFile 类(.NET 4 新增)

应用程序需要频繁地或随机地访问文件时,最好使用 MemoryMappedFile 类(映射内存的文件)。使用这种方式允许把文件的一部分或者全部加载到一段虚拟内存上,这些文件内容会显示给应用程序,就好像这个文件包含在应用程序的主内存一样。

2、使用示例

复制代码
 1         static void MemoryMappedFileTest()
 2         {
 3             //后面参数可以定义文件的大小
 4             MemoryMappedFile mmfile = MemoryMappedFile.CreateFromFile(@"D:\Document\Test.txt", FileMode.OpenOrCreate, "MapName", 1024 * 1024);
 5             //内存映射文件的视图
 6             MemoryMappedViewAccessor view = mmfile.CreateViewAccessor();
 7             //或使用数据流操作内存文件
 8             //MemoryMappedViewStream stream = mmfile.CreateViewStream();
 9             string str = "测试数据:Xunzf!";
10             int length = Encoding.UTF8.GetByteCount(str);
11             view.WriteArray<byte>(0, Encoding.UTF8.GetBytes(str), 0, length);//写入数据
12             byte[] b = new byte[length];
13             //位置,数组,偏移量,长度
14             view.ReadArray<byte>(0, b, 0, b.Length);
15             Console.WriteLine(Encoding.UTF8.GetString(b));
16             mmfile.Dispose();//释放资源
17             Console.Read();
18         }
复制代码

 

五、文件安全

1、ACL介绍

ACL是存在于计算机中的一张表(访问控制表),它使操作系统明白每个用户对特定系统对象,例如文件目录或单个文件的存取权限。每个对象拥有一个在访问控制表中定义的安全属性。这张表对于每个系统用户有拥有一个访问权限。最一般的访问权限包括读文件(包括所有目录中的文件),写一个或多个文件和执行一个文件(如果它是一个可执行文件或者是程序的时候)。

2、读取文件的ACL

复制代码
 1         static void ReadACL()
 2         {
 3             FileStream file = new FileStream(@"D:\Document\Test\Test.txt", FileMode.Open, FileAccess.Read);
 4             //得到文件访问控制属性
 5             FileSecurity filesec = file.GetAccessControl();
 6             //输出文件的访问控制项
 7             foreach (FileSystemAccessRule filerule in filesec.GetAccessRules(true, true, typeof(NTAccount)))
 8             {
 9                 Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference);
10             }
11             file.Dispose();
12             Console.Read();
13         }
复制代码

3、读取文件夹的ACL

复制代码
 1         static void ReadDACL()
 2         {
 3             DirectoryInfo dir = new DirectoryInfo(@"D:\Document\Test");
 4             DirectorySecurity filesec = dir.GetAccessControl();//得到文件访问控制属性               
 5             //输出文件的访问控制项
 6             foreach (FileSystemAccessRule filerule in filesec.GetAccessRules(true, true, typeof(NTAccount)))
 7             {
 8                 Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference);
 9             }
10             Console.Read();
11         }
复制代码

4、修改ACL

复制代码
 1         static void ModifyACL()
 2         {
 3             FileStream file = new FileStream(@"D:\Document\Test\Test.txt", FileMode.Open, FileAccess.Read);
 4             FileSecurity filesec = file.GetAccessControl();//得到文件访问控制属性
 5             PrintACL(filesec.GetAccessRules(true, true, typeof(NTAccount)));//输出文件访问控制项
 6             FileSystemAccessRule rule = new FileSystemAccessRule(
 7                 new NTAccount(@"Xunzf"), //计算机账户名
 8                 FileSystemRights.Delete, //操作权限
 9                 AccessControlType.Allow);//能否访问受保护的对象
10             filesec.AddAccessRule(rule);//增加ACL项
11             PrintACL(filesec.GetAccessRules(true, true, typeof(NTAccount)));//输出文件访问控制项
12             filesec.RemoveAccessRule(rule);//移除ACL项
13             PrintACL(filesec.GetAccessRules(true, true, typeof(NTAccount)));//输出文件访问控制项
14             file.Dispose();
15             Console.Read();
16         }
17         static void PrintACL(AuthorizationRuleCollection rules)
18         {
19             foreach (FileSystemAccessRule filerule in rules)
20             {
21                 Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference);
22             }
23             Console.WriteLine("================================================");
24         }
复制代码

这一章有很多知识点都很欠缺,学起来很吃力,等以后概念齐全再补齐

六、读写注册表

1、注册表介绍

Windows注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件,运行regedit可以看到5个注册表配置单元(实际有7个):
  HKEY-CLASSES-ROOT:    文件关联和COM信息
  HKEY-CURRENT-USER:    用户轮廓
  HKEY-LOCAL-MACHINE:   本地机器系统全局配置子键
  HKEY-USERS:         已加载用户轮廓子键
  HKEY-CURRENT-CONFIG:     当前硬件配置

2、.NET 操作注册表的类

在.NET中提供了Registry类、RegistryKey类来实现对注册表的操作。其中Registry类封装了注册表的七个基本主健:
  Registry.ClassesRoot      对应于HKEY_CLASSES_ROOT主键
  Registry.CurrentUser       对应于HKEY_CURRENT_USER主键
  Registry.LocalMachine       对应于 HKEY_LOCAL_MACHINE主键
  Registry.User           对应于 HKEY_USER主键
  Registry.CurrentConfig      对应于HEKY_CURRENT_CONFIG主键
  Registry.DynDa          对应于HKEY_DYN_DATA主键
  Registry.PerformanceData   对应于HKEY_PERFORMANCE_DATA主键
RegistryKey类封装了对注册表的基本操作,包括读取,写入,删除

其中读取的主要函数有: 
  OpenSubKey()      主要是打开指定的子键
  GetSubKeyNames()   获得主键下面的所有子键的名称,它的返回值是一个字符串数组
  GetValueNames()       获得当前子键中的所有的键名称,它的返回值也是一个字符串数组
  GetValue()        指定键的键值
写入的函数:
   CreateSubKey()    增加一个子键
   SetValue()        设置一个键的键值
删除的函数:
   DeleteSubKey()    删除一个指定的子键
   DeleteSubKeyTree()  删除该子键以及该子键以下的全部子键

3、示例

复制代码
 1         static void RegistyTest()
 2         {
 3             string path = @"SOFTWARE\Microsoft\Internet Explorer\Extensions";
 4             RegistryKey pregkey = Registry.LocalMachine.OpenSubKey(path, true);//以只读方式
 5             if (pregkey != null)
 6             {
 7                 Console.WriteLine(pregkey.Name + "--" + pregkey.SubKeyCount + "--" + pregkey.ValueCount);
 8                 string preName = System.Guid.NewGuid().ToString();
 9                 pregkey.CreateSubKey(preName);//增加一个子键
10                 RegistryKey new_pregkey = Registry.LocalMachine.OpenSubKey(path + @"\" + preName, true);
11                 new_pregkey.SetValue("姓名", "Xunzf");//设置一个键的键值
12                 new_pregkey.SetValue("键名", "值内容");//设置一个键的键值
13                 Console.WriteLine(pregkey.Name + "--" + pregkey.SubKeyCount + "--" + pregkey.ValueCount);
14                 pregkey.Close();
15                 new_pregkey.Close();
16             }
17             Console.Read();
18         }
注册表测试
复制代码

这里的代码不是很懂,等以后补全学习

 

七、读写独立的存储器

1、IsolatedStorageFile类

使用IsolatedStorageFile类可以读写独立的存储器,独立的存储器可以看成一个虚拟磁盘,在其中可以保存只由创建他们的应用程序或其应用程序程序实例共享的数据项。
独立的存储器的访问类型有两种(如下图):第一种是一个应用程序的多个实例在同一个独立存储器中工作,第二种是一个应用程序的多个实例在各自不同的独立存储器中工作。

 

 2、示例

复制代码
 1         static void IsolatedStorageFileTest()
 2         {
 3             //写文件
 4             IsolatedStorageFileStream storStream = new IsolatedStorageFileStream(@"D:\Document\Test.txt", FileMode.Create, FileAccess.Write);
 5             string str = "测试数据:Xunzf!ABCD";
 6             byte[] bs = Encoding.UTF8.GetBytes(str);
 7             storStream.Write(bs, 0, bs.Length);//写数据
 8             storStream.Dispose();
 9             //读文件
10             IsolatedStorageFile storFile = IsolatedStorageFile.GetUserStoreForDomain();
11             string[] files = storFile.GetFileNames(@"Test.txt");
12             foreach (string t in files)
13             {
14                 Console.WriteLine(t);
15                 storStream = new IsolatedStorageFileStream(t, FileMode.Open, FileAccess.Read);
16                 StreamReader sr = new StreamReader(storStream);
17                 Console.WriteLine("读取文件:" + sr.ReadToEnd());
18                 sr.Dispose();
19                 storFile.DeleteFile(t);//删除文件
20             }
21             storFile.Dispose();
22             Console.WriteLine("OK!");
23             Console.Read();
24         }
读写独立的存储器
复制代码

同上。

posted @   xunzf  阅读(199)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示