C# 文件操作
注意:文件操作类
using System.IO;
表示按照@后面的字符赋值,避免转义字符 举个例子: @"C:\test.txt" 与 "C:\\test.txt" 等价..
1. 创建文件夹
Directory.CreateDirectory(@"D:\TestDir");
2.创建文件
创建文件会出现文件被访问,以至于无法删除以及编辑。建议用上using。
using (File.Create(@"D:\TestDir\TestFile.txt"));
3.删除文件
删除文件时,最好先判断该文件是否存在!
string dirPath= @"D:\TestDir"; string dirPathFile = @"D:\TestDir\TestFile.txt"; if (File.Exists(dirPathFile )) { File.Delete(dirPathFile ); }
4.删除文件夹
删除文件夹需要对异常进行处理。可捕获指定的异常。msdn:http://msdn.microsoft.com/zh-cn/library/62t64db3(v=VS.80).aspx
Directory.Delete(dirPath); //删除空目录,否则需捕获指定异常处理 Directory.Delete(dirPath, true);//删除该目录以及其所有内容
5.删除指定目录下所有的文件和文件夹
一般有两种方法:1.删除目录后,创建空目录 2.找出下层文件和文件夹路径迭代删除
string dirPath= @"D:\TestDir"; string dirPathFile = @"D:\TestDir\TestFile.txt"; /// <summary> /// 删除指定目录下所有内容:方法一--删除目录,再创建空目录 /// </summary> /// <param name="dirPath"></param> public static void DeleteDirectoryContentEx(string dirPath) { if (Directory.Exists(dirPath)) { //删除文件目录 Directory.Delete(dirPath,true); Directory.CreateDirectory(dirPath); } } /// <summary> /// 删除指定目录下所有内容:方法二--找到所有文件和子文件夹删除 /// </summary> /// <param name="dirPath"></param> public static void DeleteDirectoryContent(string dirPath) { if (Directory.Exists(dirPath)) { //遍历文件夹下面所有文件夹和文件 foreach (string content in Directory.GetFileSystemEntries(dirPath)) { //判断遍历的是不是文件夹 if (Directory.Exists(content)) { //删除文件夹 Directory.Delete(content, true); } //判断遍历的是不是文件 else if (File.Exists(content)) { //删除文件 File.Delete(content); } } } }
6.读取文件
读取文件方法很多,File类已经封装了四种:
一、直接使用File类
1.public static string ReadAllText(string path);
2.public static string[] ReadAllLines(string path);
3.public static IEnumerable<string> ReadLines(string path);
4.public static byte[] ReadAllBytes(string path);
以上获得内容是一样的,只是返回类型不同罢了,根据自己需要调用。
二、利用流读取文件
分别有StreamReader和FileStream。详细内容请看代码。
//ReadAllLines Console.WriteLine("--{0}", "ReadAllLines"); System.Text.Encoding.GetEncoding("utf-8"); List<string> list = new List<string>(File.ReadAllLines(dirPathFile, System.Text.Encoding.Default)); list.ForEach(str => { Console.WriteLine(str); }); //ReadAllText Console.WriteLine("--{0}", "ReadAllLines"); string fileContent = File.ReadAllText(dirPathFile, System.Text.Encoding.Default); Console.WriteLine(fileContent); //StreamReader Console.WriteLine("--{0}", "StreamReader"); using (StreamReader sr = new StreamReader(dirPathFile, System.Text.Encoding.Default)) { //方法一:从流的当前位置到末尾读取流 fileContent = string.Empty; fileContent = sr.ReadToEnd(); Console.WriteLine(fileContent); //方法二:一行行读取直至为NULL fileContent = string.Empty; string strLine = string.Empty; while (strLine != null) { strLine = sr.ReadLine(); fileContent += strLine + "\r\n"; } Console.WriteLine(fileContent); }
7.写入文件
写文件内容与读取文件类似,请参考读取文件说明。
//WriteAllLines File.WriteAllLines(dirPathFile, new string[] { "11111", "22222", "3333","我是汉字!####" }); File.Delete(dirPathFile); //WriteAllText File.WriteAllText(dirPathFile, "11111\r\n222我是汉字22\r\n3333\r\n", Encoding.Default ); File.Delete(dirPathFile); // StreamWriter using (StreamWriter sw = new StreamWriter(dirPathFile)) { sw.Write("11111\r\n22222\r\n333我是汉字3\r\n", Encoding.Default); sw.Flush(); }
8.文件路径
string dirPath = @"D:\TestDir"; string filePath = @"D:\TestDir\TestFile.txt"; Console.WriteLine("<<<<<<<<<<<{0}>>>>>>>>>>", "文件路径"); //获得当前路径 Console.WriteLine(Environment.CurrentDirectory); //文件或文件夹所在目录 Console.WriteLine(Path.GetDirectoryName(filePath)); //D:\TestDir Console.WriteLine(Path.GetDirectoryName(dirPath)); //D:\ //文件扩展名 Console.WriteLine(Path.GetExtension(filePath)); //.txt //文件名 Console.WriteLine(Path.GetFileName(filePath)); //TestFile.txt Console.WriteLine(Path.GetFileName(dirPath)); //TestDir Console.WriteLine(Path.GetFileNameWithoutExtension(filePath)); //TestFile //绝对路径 Console.WriteLine(Path.GetFullPath(filePath)); //D:\TestDir\TestFile.txt Console.WriteLine(Path.GetFullPath(dirPath)); //D:\TestDir //更改扩展名 Console.WriteLine(Path.ChangeExtension(filePath, ".jpg"));//D:\TestDir\TestFile.jpg //根目录 Console.WriteLine(Path.GetPathRoot(dirPath)); //D:\ //生成路径 Console.WriteLine(Path.Combine(new string[] { @"D:\", "BaseDir", "SubDir", "TestFile.txt" })); //D:\BaseDir\SubDir\TestFile.txt //生成随即文件夹名或文件名 Console.WriteLine(Path.GetRandomFileName()); //创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径 Console.WriteLine(Path.GetTempFileName()); //返回当前系统的临时文件夹的路径 Console.WriteLine(Path.GetTempPath()); //文件名中无效字符 Console.WriteLine(Path.GetInvalidFileNameChars()); //路径中无效字符 Console.WriteLine(Path.GetInvalidPathChars());
10.文件属性操作
File类与FileInfo都能实现。静态方法与实例化方法的区别!
string dirPath = @"D:\TestDir"; string dirPathFile = @"D:\TestDir\TestFile.txt"; //use File class 文件只读 Console.WriteLine(File.GetAttributes(dirPathFile)); File.SetAttributes(dirPathFile, FileAttributes.Hidden | FileAttributes.ReadOnly); Console.WriteLine(File.GetAttributes(dirPathFile)); //user FilInfo class FileInfo fi = new FileInfo(dirPathFile); Console.WriteLine(fi.Attributes.ToString()); fi.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly; //隐藏与只读 Console.WriteLine(fi.Attributes.ToString()); //只读与系统属性,删除时会提示拒绝访问 fi.Attributes = FileAttributes.Archive; Console.WriteLine(fi.Attributes.ToString());
11.移动文件夹中所有文件夹与文件到另一个文件夹
如果是在同一个盘符中移动,则直接调用Directory.Move的方法即可!跨盘符则使用下面递归的方法!
string dirPath = @"D:\TestDir"; MoveFolder(dirPath, @"D:\TestDir11"); /// <summary> /// 移动文件夹中的所有文件夹与文件到另一个文件夹 /// </summary> /// <param name="sourcePath">源文件夹</param> /// <param name="destPath">目标文件夹</param> public static void MoveFolder(string sourcePath, string destPath) { if (Directory.Exists(sourcePath)) { if (!Directory.Exists(destPath)) { //目标目录不存在则创建 try { Directory.CreateDirectory(destPath); } catch (Exception ex) { throw new Exception("创建目标目录失败:" + ex.Message); } } //获得源文件下所有文件 List<string> files = new List<string>(Directory.GetFiles(sourcePath)); files.ForEach(c => { string destFile = Path.Combine(new string[] { destPath, Path.GetFileName(c) }); //覆盖模式 if (File.Exists(destFile)) { File.Delete(destFile); } File.Move(c, destFile); }); //获得源文件下所有目录文件 List<string> folders = new List<string>(Directory.GetDirectories(sourcePath)); folders.ForEach(c => { string destDir = Path.Combine(new string[] { destPath, Path.GetFileName(c) }); //Directory.Move必须要在同一个根目录下移动才有效,不能在不同卷中移动。 //Directory.Move(c, destDir); //采用递归的方法实现 MoveFolder(c, destDir); }); } else { throw new DirectoryNotFoundException("源目录不存在!"); } }
12.复制文件夹中所有文件夹与文件到另外的一个文件夹
如果是需要移动指定类型的文件或者包含某些字符的目录,只需在Directory.GetFiles中加上查询条件即可!
/// <summary> /// 复制文件夹中的所有文件夹与文件到另一个文件夹 /// </summary> /// <param name="sourcePath">源文件夹</param> /// <param name="destPath">目标文件夹</param> public static void CopyFolder(string sourcePath,string destPath) { if (Directory.Exists(sourcePath)) { if (!Directory.Exists(destPath)) { //目标目录不存在则创建 try { Directory.CreateDirectory(destPath); } catch (Exception ex) { throw new Exception("创建目标目录失败:" + ex.Message); } } //获得源文件下所有文件 List<string> files = new List<string>(Directory.GetFiles(sourcePath)); files.ForEach(c => { string destFile = Path.Combine(new string[]{destPath,Path.GetFileName(c)}); File.Copy(c, destFile,true);//覆盖模式 }); //获得源文件下所有目录文件 List<string> folders = new List<string>(Directory.GetDirectories(sourcePath)); folders.ForEach(c => { string destDir = Path.Combine(new string[] { destPath, Path.GetFileName(c) }); //采用递归的方法实现 CopyFolder(c, destDir); }); } else { throw new DirectoryNotFoundException("源目录不存在!"); } }