C#File类常用文件操作以及一个模拟的控制台文件管理系统
重温一下C#中File类的一些基本操作:
File类,是一个静态类,主要是来提供一些函数库用的。
使用时需要引入System.IO命名空间。
一、常用操作:
1、创建文件方法
//参数1:要创建的文件路径
File.Create(@"D:\Test\Debug1\测试.txt")
2、打开文件方法
//参数1:要打开的文件路径,参数2:打开的文件方式
File.Open(@"D:\Test\Debug1\测试.txt",FileMode.Append)
3、追加文件方法
//参数1:要追加的文件路径,参数2:追加的内容
File.AppendAllText(@"D:\Test\Debug1\测试.txt","哈哈");
4、复制文件方法
//参数1:要复制的源文件路径,参数2:复制后的目标文件路径,参数3:是否覆盖相同文件名
File.Copy(@"D:\Test\Debug1\测试.txt", @"D:\Test\Debug2\测试1.txt", true);
5、移动文件方法
//参数1:要移动的源文件路径,参数2:移动后的目标文件路径
File.Move(@"D:\Test\Debug1\测试.txt", @"D:\Test\Debug3\测试2.txt");
6、删除文件方法
//参数1:要删除的文件路径
File.Delete(@"D:\Test\Debug1\测试.txt");
7、设置文件属性方法
//参数1:要设置属性的文件路径,参数2:设置的属性类型(只读、隐藏等)
File.SetAttributes(@"D:\Test\Debug1\测试.txt", FileAttributes.Hidden);
二、读写操作:
当读取的文件内容不多时:
- File.ReadAllText(FilePath)
- File.ReadAllText(FilePath, Encoding)
- File.ReadAllLines(FilePath)
例如:
- string str = File.ReadAllText(@"c:\temp\ascii.txt");
- string str2 = File.ReadAllText(@"c:\temp\ascii.txt", Encoding.ASCII);
- string[] strs = File.ReadAllLines(@"c:\temp\ascii.txt");
读取内容比较多时:使用StreamReader类
初始化:
- StreamReader sr1 = new StreamReader(@"c:\temp\utf-8.txt");
- StreamReader sr2 = new StreamReader(@"c:\temp\utf-8.txt", Encoding.UTF8);
- FileStream fs = new FileStream(@"C:\temp\utf-8.txt", FileMode.Open, FileAccess.Read, FileShare.None);
- StreamReader sr3 = new StreamReader(fs);
- StreamReader sr4 = new StreamReader(fs, Encoding.UTF8);
初始化后:
读一行
- string nextLine = sr.ReadLine();
读一个字符
- int nextChar = sr.Read();
读100个字符
- int nChars = 100;
- char[] charArray = new char[nChars];
- int nCharsRead = sr.Read(charArray, 0, nChars);
全部读完
- string restOfStream = sr.ReadToEnd();
使用完StreamReader之后,不要忘记关闭它:
- sr.Closee();
写的内容不多时候
- string str1 = "Good Morning!";
- File.WriteAllText(@"c:\temp\test\ascii.txt", str1);
- string[] strs = { "Good Morning!", "Good Afternoon!" };
- File.WriteAllLines(@"c:\temp\ascii.txt", strs);
写的内容比较多时使用StreamWriter
如果文件不存在,创建文件; 如果存在,覆盖文件
- StreamWriter sw1 = new StreamWriter(@"c:\temp\utf-8.txt");
- FileStream fs = new FileStream(@"C:\temp\utf-8.txt", FileMode.CreateNew, FileAccess.Write, FileShare.Read);
- StreamWriter sw3 = new StreamWriter(fs);
如果文件不存在,创建文件; 如果存在,覆盖文件
- FileInfo myFile = new FileInfo(@"C:\temp\utf-8.txt");
- StreamWriter sw5 = myFile.CreateText();
初始化完成后,可以用StreamWriter对象一次写入一行,一个字符,一个字符数组,甚至一个字符数组的一部分。
写一个字符
- sw.Write('a');
写一个字符数组
- char[] charArray = new char[100];
- sw.Write(charArray);
写一个字符数组的一部分
- sw.Write(charArray, 10, 15);
同样,StreamWriter对象使用完后,不要忘记关闭。
- sw.Close();
=================================================================
接下来是一个简单的控制台应用程序的源码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.IO; 7 8 namespace _033_test 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 FileManager file = new FileManager(); 15 file.MenuChoice(); 16 17 Console.ReadKey(); 18 } 19 } 20 21 class FileManager 22 { 23 public void DisPlayer() 24 { 25 Console.WriteLine("============File Management System============="); 26 Console.WriteLine("1.Create 2.Delete 3.Check 4.Revise"); 27 Console.WriteLine("==============================================="); 28 Console.WriteLine("请输入你要进行的操作编号,中途如要返回上一级请输入exit"); 29 } 30 31 public void MenuChoice() 32 { 33 while (true) 34 { 35 DisPlayer(); 36 string choice = Console.ReadLine(); 37 switch (choice) 38 { 39 case "1": Create(); continue; 40 case "2": Delete(); continue; 41 case "3": Check(); continue; 42 case "4": Revise(); continue; 43 case "exit": return; 44 default: Console.WriteLine("请重新输入正确的选项"); break; 45 } 46 } 47 } 48 49 public void Create() 50 { 51 Console.WriteLine("请指定路径:"); 52 while (true) 53 { 54 string path = Console.ReadLine(); 55 if (path == "exit") 56 { 57 Console.WriteLine("返回上一级"); 58 break; 59 } 60 try 61 { 62 if (File.Exists(path)) 63 { 64 Console.WriteLine("是否覆盖原文件?Y/N"); 65 string str = Console.ReadLine(); 66 if (str == "y" || str == "Y") 67 { 68 File.Create(path).Close(); 69 Console.WriteLine("已覆盖原文件"); 70 break; 71 } 72 else 73 { 74 Console.WriteLine("放弃覆盖,请重新输入路径"); 75 continue; 76 } 77 } 78 else 79 { 80 File.Create(path).Close(); 81 Console.WriteLine("文件已创建"); 82 break; 83 } 84 } 85 catch (Exception) 86 { 87 Console.WriteLine("错误路径,请重新输入"); 88 continue; 89 } 90 } 91 } 92 93 public void Delete() 94 { 95 Console.WriteLine("请指定路径:"); 96 while (true) 97 { 98 string path = Console.ReadLine(); 99 if (path == "exit") 100 { 101 Console.WriteLine("返回上一级"); 102 break; 103 } 104 if (File.Exists(path)) 105 { 106 File.Delete(path); 107 Console.WriteLine("文件已删除"); 108 break; 109 } 110 else 111 { 112 Console.WriteLine("不存在该文件,请重新输入路径"); 113 continue; 114 } 115 } 116 } 117 118 public void Check() 119 { 120 Console.WriteLine("请指定路径:"); 121 while (true) 122 { 123 string path = Console.ReadLine(); 124 if (path == "exit") 125 { 126 Console.WriteLine("返回上一级"); 127 break; 128 } 129 if (File.Exists(path)) 130 { 131 FileInfo fInfo = new FileInfo(path); 132 Console.WriteLine("1.查看文件信息 2.查看文件内容"); 133 while (true) 134 { 135 string str = Console.ReadLine(); 136 switch (str) 137 { 138 case "1": 139 Console.WriteLine("文件名:" + fInfo.Name); 140 Console.WriteLine("创建时间:" + fInfo.CreationTime); 141 Console.WriteLine("最后修改时间:" + fInfo.LastWriteTime); 142 Console.WriteLine("字节大小:" + fInfo.Length); 143 break; 144 case "2": 145 string type = Path.GetExtension(path); 146 if (type == ".doc" || type == ".txt") 147 { 148 byte[] brr = File.ReadAllBytes(path); 149 string value = Encoding.Default.GetString(brr, 0, brr.Length); 150 Console.WriteLine(value); 151 } 152 else 153 { 154 Console.WriteLine("该类型文件不支持查看"); 155 } 156 break; 157 default: Console.WriteLine("错误指令,请重新输入:"); continue; 158 } 159 break; 160 } 161 break; 162 } 163 else 164 { 165 Console.WriteLine("不存在该文件,请重新输入路径"); 166 continue; 167 } 168 } 169 } 170 171 public void Revise() 172 { 173 Console.WriteLine("请指定路径:"); 174 while (true) 175 { 176 string path = Console.ReadLine(); 177 if (path == "exit") 178 { 179 Console.WriteLine("返回上一级"); 180 break; 181 } 182 if (File.Exists(path)) 183 { 184 Console.WriteLine("1.修改内容 2.修改文件名 3.文末添加"); 185 while (true) 186 { 187 string str = Console.ReadLine(); 188 switch (str) 189 { 190 case "1": 191 Console.WriteLine("本功能允许你将某个字符串替换成另一个字符"); 192 string type = Path.GetExtension(path); 193 if (type == ".doc" || type == ".txt") 194 { 195 byte[] brr = File.ReadAllBytes(path); 196 string value = Encoding.Default.GetString(brr, 0, brr.Length); 197 Console.WriteLine("请输入你要修改的字符串,若文件中有该字符,将全部替换"); 198 string str2 = Console.ReadLine(); 199 Console.WriteLine("请输入将要修改为的字符串"); 200 string str3 = Console.ReadLine(); 201 byte[] brr2 = Encoding.Default.GetBytes(value.Replace(str2, str3)); 202 File.WriteAllBytes(path, brr2); 203 } 204 else 205 { 206 Console.WriteLine("该类型文件不支持修改"); 207 } 208 break; 209 case "2": 210 FileInfo f = new FileInfo(path); 211 while (true) 212 { 213 try 214 { 215 Console.WriteLine("请输入文件名(不需要输入拓展名和路径)"); 216 string fName = Console.ReadLine(); 217 //获取文件的父目录和拓展名,并加在fname两边,使其做到重命名的效果 218 File.Move(path, f.Directory + "\\" + fName + Path.GetExtension(path)); 219 Console.WriteLine("已将该文件重命名"); 220 } 221 catch (Exception) { 222 Console.WriteLine("文件名出错,重新输入!"); 223 continue; 224 } 225 break; 226 } 227 break; 228 case "3": 229 Console.WriteLine("请输入内容,回车换行,exit退出"); 230 FileStream fs = new FileStream(path, FileMode.Append); 231 while (true) 232 { 233 string value = Console.ReadLine(); 234 if (value == "exit") break; 235 byte[] arr = Encoding.Default.GetBytes(value + "\r\n"); 236 fs.Write(arr, 0, arr.Length); 237 fs.Flush(); 238 } 239 fs.Close(); 240 break; 241 default: Console.WriteLine("错误指令,请重新输入:"); continue; 242 } 243 break; 244 } 245 break; 246 } 247 else 248 { 249 Console.WriteLine("不存在该文件,请重新输入路径"); 250 continue; 251 } 252 } 253 } 254 } 255 256 257 }
运行结果:
参考来源:https://www.cnblogs.com/xielong/p/6187308.html、https://www.cnblogs.com/Herzog3/p/5090974.html