c# IO操作

今天我们主要讨论的IO的一些操作,首先我们先引入三个变量:

 /// <summary>
 /// 配置绝对路径
 /// </summary>
 private static string LogPath = ConfigurationManager.AppSettings["LogPath"];
 private static string LogMovePath = ConfigurationManager.AppSettings["LogMovePath"];
 /// <summary>
 /// 获取当前程序路径,找到当前运行的exe程序所在的全路径即是D:\...\bin\Debug\
 /// </summary>
 private static string LogPath2 = AppDomain.CurrentDomain.BaseDirectory;

以下代码会用到上面的变量!

一:Directory操作类

 1  if (!Directory.Exists(LogPath)) //判断文件夹是否存在
 2  {
 3      //一次性创建全部的子路径,如果文件夹存在不报错 D:\testIo\20190131\Log\
 4      DirectoryInfo directoryInfo = Directory.CreateDirectory(LogPath);
 5 
 6      //移动  原文件夹就不在了 LogPath原始文件,LogMovePath现在文件夹(移动的时候里面的所有文件都随着移动),
 7      //当LogMovePath存在时,则会报错
 8      //如:LogPath=D:	estIo20190131Log
 9      //    LogMovePath=D:	estIo20190132LogMove:(20190132这个文件夹必须存在,不然会报错)
10      // 则会把LogPath的log重命名为LogMove,转移到20190132这个文件夹下面,则20190131中的Log就会删除
11      Directory.Move(LogPath, LogMovePath);
12 
13      //删除(最底层的文件夹)
14      //如果LogMovePath为D:\testIo\20190132\LogMove,则会删除LogMove,如果LogMove里面有内容或者文件夹,需要第二个参数赋值为:true,
15      //则会把LogMove以及对应的子文件或者文件夹全部删除不然会报错不能删除
16      LogMovePath = @"D:	estIo20190132";
17      Directory.Delete(LogMovePath,true);
18  }

二:File类的操作类

 1 {
 2     //无论LogPath最后有没有/,最后都会根据需求自动以/隔开的
 3     string fileName = Path.Combine(LogPath, "log.txt");
 4     string fileNameCopy = Path.Combine(LogPath, "logCopy.txt");
 5     string fileNameMove = Path.Combine(LogPath, "logMove.txt");
 6     bool isExists = File.Exists(fileName); //判断文件是否存在
 7     if (!isExists)
 8     {
 9         Directory.CreateDirectory(LogPath);//创建了文件夹之后,才能创建里面的文件
10         using (FileStream fileStream = File.Create(fileName))//打开文件流 (创建文件并写入,如果存在则会先删除再重新创建写入)
11         {
12             string name = "小伙伴大家好!";
13             byte[] bytes = Encoding.Default.GetBytes(name);
14             fileStream.Write(bytes, 0, bytes.Length);
15             fileStream.Flush();
16         }
17         using (FileStream fileStream = File.Create(fileName))//打开文件流 (创建文件并写入,如果存在则会先删除再重新创建写入)
18         {
19             StreamWriter sw = new StreamWriter(fileStream);
20             sw.WriteLine("筒子们大家好!");
21             sw.Flush();
22         }
23 
24         using (StreamWriter sw = File.AppendText(fileName))//流写入器(创建/打开文件并写入(之前文件如果有内容,则会保留,在后面追加))
25         {
26             string msg = "今天我们讨论一下IO操作器!";
27             sw.WriteLine(msg);
28             sw.Flush();
29         }
30         using (StreamWriter sw = File.AppendText(fileName))//流写入器(创建/打开文件并写入)
31         {
32             string name = "那让我们一起揭开IO的面纱!";
33             byte[] bytes = Encoding.Default.GetBytes(name);
34             sw.BaseStream.Write(bytes, 0, bytes.Length);
35             sw.Flush();
36         }
37 
38         foreach (string result in File.ReadAllLines(fileName))
39         {
40             Console.WriteLine(result);
41         }
42 
43         string sResult = File.ReadAllText(fileName); //读取文件的所有内容,得到字符串
44 
45         Byte[] byteContent = File.ReadAllBytes(fileName); //读取文件的所有内容,得到字节
46         string sResultByte =Encoding.UTF8.GetString(byteContent); //把字节转换为字符串
47 
48         using (FileStream stream = File.OpenRead(fileName))//分批读取
49         {
50             int length = 5;
51             int result = 0;
52 
53             do
54             {
55                 byte[] bytes = new byte[length];
56                 result = stream.Read(bytes, 0, 5);
57                 for (int i = 0; i < result; i++)
58                 {
59                     Console.WriteLine(bytes[i].ToString());
60                 }
61             }
62             while (length == result);
63         }
64 
65         File.Copy(fileName, fileNameCopy); //文件copy
66         File.Move(fileName, fileNameMove); //同上面文件夹移动
67         File.Delete(fileNameCopy); //删除fileNameCopy
68         File.Delete(fileNameMove);//删除fileNameMove,但是尽量不要delete
69     }
70 }

三:DriveInfo类

 1 {
 2     DriveInfo[] drives = DriveInfo.GetDrives();
 3     foreach (DriveInfo drive in drives)
 4     {
 5         //TotalSize 是字节
 6         if (drive.IsReady)
 7             Console.WriteLine($"类型:{drive.DriveType} 卷标:{drive.VolumeLabel} 名称:{drive.Name} 总空间:{drive.TotalSize} 剩余空间:{drive.TotalFreeSpace}");
 8         else
 9             Console.WriteLine($"类型:{drive.DriveType}  is not ready");
10     }
11 }

四:Path操作类

 1 {
 2     Console.WriteLine(Path.GetDirectoryName(LogPath));  //返回目录名,需要注意路径末尾是否有反斜杠对结果是有影响的
 3     Console.WriteLine(Path.GetDirectoryName(@"d:\abc")); //将返回 d:
 4     Console.WriteLine(Path.GetDirectoryName(@"d:\abc"));// 将返回 d:abc
 5     Console.WriteLine(Path.GetRandomFileName());//将返回随机的文件名
 6     Console.WriteLine(Path.GetFileNameWithoutExtension("d:\abc.txt"));// 将返回abc
 7     Console.WriteLine(Path.GetInvalidPathChars());// 将返回禁止在路径中使用的字符
 8     Console.WriteLine(Path.GetInvalidFileNameChars());//将返回禁止在文件名中使用的字符
 9     Console.WriteLine(Path.Combine(LogPath, "log.txt"));//合并两个路径Combine文件夹不用关心有没有"/",如果没有会自动添加一个"/"
10 }

五:最后来一个找到一个文件夹下面找出全部的子文件夹(使用递归)

 1 public class Recursion
 2     {
 3         /// <summary>
 4         /// 找出全部的子文件夹
 5         /// </summary>
 6         /// <param name="rootPath">根目录</param>
 7         /// <returns></returns>
 8         public static List<DirectoryInfo> GetAllDirectory(string rootPath)
 9         {
10             if (!Directory.Exists(rootPath))
11                 return new List<DirectoryInfo>();
12 
13             List<DirectoryInfo> directoryList = new List<DirectoryInfo>();//容器
14             DirectoryInfo directory = new DirectoryInfo(rootPath);//root文件夹
15             directoryList.Add(directory);
16 
17             return GetChild(directoryList, directory);            
18         }
19 
20         /// <summary>
21         /// 完成 文件夹--子目录--放入集合
22         /// </summary>
23         /// <param name="directoryList"></param>
24         /// <param name="directoryCurrent"></param>
25         /// <returns></returns>
26         private static List<DirectoryInfo> GetChild(List<DirectoryInfo> directoryList, DirectoryInfo directoryCurrent)
27         {
28             var childArray = directoryCurrent.GetDirectories();
29             if (childArray != null && childArray.Length > 0)
30             {
31                 directoryList.AddRange(childArray);
32                 foreach (var child in childArray)
33                 {
34                     GetChild(directoryList, child);
35                 }
36             }
37             return directoryList;
38         }        
39     }
View Code

思维图如下: 

原文地址:https://www.cnblogs.com/loverwangshan/p/10342821.html