05.C#常用IO流与读写文件

1.文件系统

(1)文件系统类的介绍

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

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

(2)FileInfo与File类

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. FileInfo file = new FileInfo(@"E:\学习笔记\C#平台\test.txt");//创建文件
  6. Console.WriteLine("创建时间:" + file.CreationTime);
  7. Console.WriteLine("路径:" + file.DirectoryName);
  8. StreamWriter sw = file.AppendText();//打开追加流
  9. sw.Write("李志伟");//追加数据
  10. sw.Dispose();//释放资源,关闭文件
  11. File.Move(file.FullName, @"E:\学习笔记\test.txt");//移动
  12. Console.WriteLine("完成!");
  13. Console.Read();
  14. }
  15. }

(3)DirectoryInfo与Directory类

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //创建文件夹
  6. DirectoryInfo directory = new DirectoryInfo(@"E:\学习笔记\C#平台\test");
  7. directory.Create();
  8. Console.WriteLine("父文件夹:" + directory.Parent.FullName);
  9. //输出父目录下的所有文件与文件夹
  10. FileSystemInfo[] files = directory.Parent.GetFileSystemInfos();
  11. foreach (FileSystemInfo fs in files)
  12. {
  13. Console.WriteLine(fs.Name);
  14. }
  15. Directory.Delete(directory.FullName);//删除文件夹
  16. Console.WriteLine("完成!");
  17. Console.Read();
  18. }
  19. }

(4)Path类

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Console.WriteLine(Path.Combine(@"E:\学习笔记\C#平台", @"Test\Test.TXT"));//连接
  6. Console.WriteLine("平台特定的字符:" + Path.DirectorySeparatorChar);
  7. Console.WriteLine("平台特定的替换字符:" + Path.AltDirectorySeparatorChar);
  8. Console.Read();
  9. }
  10. }

(5)DriveInfo类

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. DriveInfo[] drives = DriveInfo.GetDrives();
  6. foreach (DriveInfo d in drives)
  7. {
  8. if (d.IsReady)
  9. {
  10. Console.WriteLine("总容量:" + d.TotalFreeSpace);
  11. Console.WriteLine("可用容量:" + d.AvailableFreeSpace);
  12. Console.WriteLine("驱动器类型:" + d.DriveFormat);
  13. Console.WriteLine("驱动器的名称:" + d.Name + "\n");
  14. }
  15. }
  16. Console.WriteLine("OK!");
  17. Console.Read();
  18. }
  19. }

2.文件操作

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

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string path = @"E:\学习笔记\C#平台\Test.txt";
  6. File.WriteAllText(path, "测试数据");
  7. Console.WriteLine("文件已创建,请查看!");
  8. Console.ReadLine();
  9. File.Move(path, @"E:\学习笔记\Test.txt");
  10. Console.WriteLine("移动完成,请查看!");
  11. Console.ReadLine();
  12. File.Copy(@"E:\学习笔记\Test.txt", path);
  13. Console.WriteLine("文件已复制,请查看!");
  14. Console.ReadLine();
  15. File.Delete(path);
  16. File.Delete(@"E:\学习笔记\Test.txt");
  17. Console.WriteLine("文件已删除,请查看!\nOK!");
  18. Console.Read();
  19. }
  20. }

(2)判断是文件还是文件夹

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. IsFile(@"E:\学习笔记\C#平台\Test.txt");
  6. IsFile(@"E:\学习笔记\");
  7. IsFile(@"E:\学习笔记\XXXXXXX");
  8. Console.Read();
  9. }
  10. //判断路径是否是文件或文件夹
  11. static void IsFile(string path)
  12. {
  13. if (Directory.Exists(path))
  14. {
  15. Console.WriteLine("是文件夹!");
  16. }
  17. else if (File.Exists(path))
  18. {
  19. Console.WriteLine("是文件!");
  20. }
  21. else
  22. {
  23. Console.WriteLine("路径不存在!");
  24. }
  25. }
  26. }

3.读写文件与数据流

(1)读文件

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string path = @"E:\学习笔记\C#平台\Test.txt";
  6. byte[] b = File.ReadAllBytes(path);
  7. Console.WriteLine("ReadAllBytes读二进制:");
  8. foreach (byte temp in b)
  9. {
  10. Console.Write((char)temp+" ");
  11. }
  12. string[] s = File.ReadAllLines(path, Encoding.UTF8);
  13. Console.WriteLine("\nReadAllLines读所有行:");
  14. foreach (string temp in s)
  15. {
  16. Console.WriteLine("行:"+temp);
  17. }
  18. string str = File.ReadAllText(path, Encoding.UTF8);
  19. Console.WriteLine("ReadAllText读所有行:\n" + str);
  20. Console.Read();
  21. }
  22. }

(2)写文件

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string path = @"E:\学习笔记\C#平台\Test.txt";
  6. File.WriteAllBytes(path,new byte[] {0,1,2,3,4,5,6,7,8,9});//写入二进制
  7. Console.WriteLine("WriteAllBytes写入二进制成功");
  8. Console.ReadLine();
  9. string[] array = {"123","456","7890"};
  10. File.WriteAllLines(path, array, Encoding.UTF8);//写入所有行
  11. Console.WriteLine("WriteAllLines写入所有行成功");
  12. Console.ReadLine();
  13. File.WriteAllText(path, "abcbefghijklmn",Encoding.UTF8);//写入字符串
  14. Console.WriteLine("WriteAllText写入字符串成功\nOK!");
  15. Console.Read();
  16. }
  17. }

(3)数据流

最常用的流类如下:

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

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

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

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

数据流类的层次结构:

(4)使用FileStream读写二进制文件

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string path = @"E:\学习笔记\C#平台\Test.txt";
  6. //以写文件的方式创建文件
  7. FileStream file = new FileStream(path, FileMode.CreateNew, FileAccess.Write);
  8. string str = "测试文件--李志伟";
  9. byte[] bytes = Encoding.Unicode.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.Unicode.GetString(temp));
  19. file.Dispose();
  20. Console.Read();
  21. }
  22. }

(5)StreamWriter与StreamReader

使用StreamWriterStreamReader就不用担心文本文件的编码方式,所以它们很适合读写文本文件。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string path = @"E:\学习笔记\C#平台\Test.txt";
  6. //以写文件的方式创建文件
  7. FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write);
  8. StreamWriter sw = new StreamWriter(file);
  9. sw.WriteLine("测试文件--李志伟");
  10. sw.Dispose();
  11. Console.WriteLine("写入数据成功!!!");
  12. Console.ReadLine();
  13. //以读文件的方式打开文件
  14. file = new FileStream(path, FileMode.Open, FileAccess.Read);
  15. StreamReader sr = new StreamReader(file);
  16. Console.WriteLine("读取数据:"+sr.ReadToEnd());
  17. sr.Dispose();
  18. Console.Read();
  19. }
  20. }

4.映射内存的文件

(1)MemoryMappedFile类(.NET4新增)

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

(2)使用示例

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. MemoryMappedFile mmfile = MemoryMappedFile.CreateFromFile(@"E:\Test.txt", FileMode.OpenOrCreate, "MapName", 1024 * 1024);
  6. MemoryMappedViewAccessor view = mmfile.CreateViewAccessor();//内存映射文件的视图
  7. //或使用数据流操作内存文件
  8. //MemoryMappedViewStream stream = mmfile.CreateViewStream();
  9. string str = "测试数据:李志伟!";
  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. view.ReadArray<byte>(0, b, 0, b.Length);
  14. Console.WriteLine(Encoding.UTF8.GetString(b));
  15. mmfile.Dispose();//释放资源
  16. Console.Read();
  17. }
  18. }

5.文件安全

(1)ACL介绍

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

(2)读取文件的ACL

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

(3)读取文件夹的ACL

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. DirectoryInfo dir= new DirectoryInfo(@"E:\学习笔记\C#平台");
  6. DirectorySecurity filesec = dir.GetAccessControl();//得到文件访问控制属性
  7. //输出文件的访问控制项
  8. foreach (FileSystemAccessRule filerule in filesec.GetAccessRules(true, true, typeof(NTAccount)))
  9. {
  10. Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference);
  11. }
  12. Console.Read();
  13. }
  14. }

(4)修改ACL

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

6.读写注册表

(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. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string path = @"SOFTWARE\Microsoft\Internet Explorer\Extensions";
  6. RegistryKey pregkey = Registry.LocalMachine.OpenSubKey(path, true);//以只读方式
  7. if (pregkey != null)
  8. {
  9. Console.WriteLine(pregkey.Name + "--" + pregkey.SubKeyCount + "--" + pregkey.ValueCount);
  10. string preName = System.Guid.NewGuid().ToString();
  11. pregkey.CreateSubKey(preName);//增加一个子键
  12. RegistryKey new_pregkey = Registry.LocalMachine.OpenSubKey(path + @"\" + preName, true);
  13. new_pregkey.SetValue("姓名", "李志伟");//设置一个键的键值
  14. new_pregkey.SetValue("键名", "值内容");//设置一个键的键值
  15. Console.WriteLine(pregkey.Name + "--" + pregkey.SubKeyCount + "--" + pregkey.ValueCount);
  16. pregkey.Close();
  17. new_pregkey.Close();
  18. }
  19. Console.Read();
  20. }
  21. }

7.读写独立的存储器

(1)IsolatedStorageFile类

使用IsolatedStorageFile类可以读写独立的存储器,独立的存储器可以看成一个虚拟磁盘,在其中可以保存只由创建他们的应用程序或其应用程序程序实例共享的数据项。

独立的存储器的访问类型有两种(如下图):第一种是一个应用程序的多个实例在同一个独立存储器中工作,第二种是一个应用程序的多个实例在各自不同的独立存储器中工作。

(2)示例

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //写文件
  6. IsolatedStorageFileStream storStream = new IsolatedStorageFileStream(@"Test.txt", FileMode.Create, FileAccess.Write);
  7. string str = "测试数据:李志伟!ABCD";
  8. byte[] bs = Encoding.UTF8.GetBytes(str);
  9. storStream.Write(bs, 0, bs.Length);//写数据
  10. storStream.Dispose();
  11. //读文件
  12. IsolatedStorageFile storFile = IsolatedStorageFile.GetUserStoreForDomain();
  13. string[] files=storFile.GetFileNames(@"Test.txt");
  14. foreach (string t in files)
  15. {
  16. Console.WriteLine(t);
  17. storStream = new IsolatedStorageFileStream(t, FileMode.Open, FileAccess.Read);
  18. StreamReader sr=new StreamReader(storStream);
  19. Console.WriteLine("读取文件:"+sr.ReadToEnd());
  20. sr.Dispose();
  21. storFile.DeleteFile(t);//删除文件
  22. }
  23. storFile.Dispose();
  24. Console.WriteLine("OK!");
  25. Console.Read();
  26. }
  27. }

-------------------------------------------------------------------------------------------------------------------------------

来自为知笔记(Wiz)

时间: 2024-08-05 16:23:10

05.C#常用IO流与读写文件的相关文章

C#常用IO流与读写文件

1.文件系统 (1)文件系统类的介绍 文件操作类大都在System.IO命名空间里.FileSystemInfo类是任何文件系统类的基类:FileInfo与File表示文件系统中的文件:DirectoryInfo与Directory表示文件系统中的文件夹:Path表示文件系统中的路径:DriveInfo提供对有关驱动器的信息的访问.注意,XXXInfo与XXX类的区别是:XXX是静态类,XXXInfo类可以实例化. 还有个较为特殊的类System.MarshalByRefObject允许在支持远

C#常用IO流及读写文件

1.文件系统 (1)文件系统类的介绍 文件操作类大都在System.IO命名空间里.FileSystemInfo类是任何文件系统类的基类:FileInfo与File表示文件系统中的文件:DirectoryInfo与Directory表示文件系统中的文件夹:Path表示文件系统中的路径:DriveInfo提供对有关驱动器的信息的访问.注意,XXXInfo与XXX类的区别是:XXX是静态类,XXXInfo类可以实例化. 还有个较为特殊的类System.MarshalByRefObject允许在支持远

java常用IO流数据流小结

  类名 常用方法 说明 输入流 InputStream int read(); 只能读字节流,虽然返回值是int,但只有低8位起作用. DataInputStream Type readType(); 可以读二进制流,可以读byte,short,int,long,double等二进制流. BufferedReader String readLine(); 可以读文本行. 输出流 OutputStream void write(int); 只能写字节流,虽然形参是int,但只有低8为起作用. D

java——用递归和IO流来实现文件的复制

1 import java.io.ByteArrayInputStream; 2 import java.io.ByteArrayOutputStream; 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.Ou

Java中常用IO流之文件流的基本使用姿势

所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流.IO操作比较复杂,涉及到的系统调用比较多,相对操作内存而言性能很低.然而值得兴奋的是,Java提供了很多实现类以满足不同的使用场景,这样的实现类有很多,我只挑选些在日常编码中经常用到的类进行说明,本节主要介绍和文件操作相关的流,下面一起来瞧瞧吧. File File是Java在整个文件IO体系中比较

java IO流之三 使用缓冲流来读写文件

原文:http://blog.csdn.net/haluoluo211/article/details/52183219 一.通过BufferedReader和BufferedWriter来读写文件 使用缓冲流的好处是,能够更高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来.经常使用的是readLine()方法,表示一次读取一行数据. package org.example.io; import java.io.BufferedReader; import java.io.Buf

java.io几种读写文件的方式

一.Java把这些不同来源和目标的数据都统一抽象为数据流. Java语言的输入输出功能是十分强大而灵活的. 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流. 这里介绍几种读写文件的方式 二.InputStream.OutputStream(字节流) //读取文件(字节流) InputStream in = new FileInputStream("d:\\1.txt"); //写入相应的文件

java IO流实现删除文件夹以及文件夹中的内容

这篇主要是对IO文件流对文件常用处理中的删除文件夹,平时我们直接删除文件夹既可以删除里面的全部内容. 但是java在实现删除时,只能是文件才会被删除. 所以这里需要定义一个方法,来递归调用方法(递归调用,就是在方法的内部调用自己),实现文件夹里面的全部文件删除 注意:做这个测试的时候,一定要备份,如果删除成功就不会回复了 结果如下:

Java 基础(四)| IO 流之使用文件流的正确姿势

为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既然是流动也就会有方向,有入方向和出方向.举个上传文件的栗子,现在有三个对象,文件.应用程序.上传的目标地址(服务器).简化的上传文件有两步: 应用程序读文件