C# 文件操作

对文件的操作,要引用 System.IO 命名空间

一、文件检索

1、Directory 和 File :

静态类;
父类:Object;
静态方法对文件进行创建、移动、删除和枚举所有文件夹和子文件夹成员
注:Move() 移动文件时源路径和目标路径必须具有相同的根,即移动操作在卷之间无效! 移动的目标文件夹不能存在

直接调用,使用方便,但是操作文件每次都要安全检查
if(Directory.Exits(path)) //文件存在性判断
注:path格式:@“F:\Unity\Demo” 或 “双\\”

2、DirectoryInfo 和 FileInfo

非静态类;
父类:FileSystemInfo;
需要实例化,安全性能高,适用于遍历子目录及目录中的文件列表
.Extension 获取文件扩展名

3、FileAttributes

提供文件和目录的属性的类

a、剔除隐藏文件 与运算
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileAttributes fileAttributes = new FileAttributes();

fileAttributes = dirInfo.Attributes & FileAttributes.Hidden;
if (fileAttributes == FileAttributes.Hidden)
{ //continue; }

b、设置文件隐藏或运算
DirectoryInfo dirInfo = new DirectoryInfo(path);
dirInfo.Attributes |= FileAttributes.Hidden;

4、递归

public static void GetJPG(DirectoryInfo dir)
{
	FileInfo[] files = dir.GetFiles();		//获取文件对象
	foreach(FileInfo file in files)
	{
		//扩展名为.jpg的文件过滤出来
		if(file.Extension==".jpg")
		{
			Console.WriteLine(file.name);
		}
	}
	DirectoryInfo[] dirs = dir.GetDirectories();
	foreach(DirectoryInfo dirInfo in dirs)
	{
		GetJPG(dirInfo);		//递归核心:方法中调用方法本身
	}
}

二、文件流

1、FileStream

FileStream只能对“字节”操作
FileStream(string FilePath,FileMode.xxx)FileMode枚举类型Create/Open/…

/// 
 /// 打开文件
 /// 
 /// 目标文件路径
 public string OpenFile(string path)
 {
     FileStream fs = new FileStream(path, FileMode.Open);

     byte[] bArray;      //存储数据缓冲区
     string content = null;
     UTF8Encoding encoding = new UTF8Encoding();

     //可变字符串类,优化下面代码中的字符串叠加
     StringBuilder builder = new StringBuilder();

	 //要读取的数据大于存储数组的长度时,循环读取
     while (true)
     {
         bArray = new byte[10];		//存储数据缓冲区
         
         //Read()方法返回的是数据的长度,int类型
         int count = fs.Read(bArray, 0, 10);

		 //当读取到的数据为空时,说明数据读取完毕,退出循环
         if (count == 0)
         {
             break;
         }
         else
         {
             //content += encoding.GetString(bArray);

             //代码优化:替代上述的 += ,提升性能
             content = encoding.GetString(bArray);
             builder.Append(content);      //叠加字符串 
         }
     }
     //关闭文件流
	 fs.Close();
	 return builder.ToString();
 }

注:最后要记得关闭文件流 fs.Close();

2、StreamReader 和 StreamWriter

可添加 Try-Catch块 来捕捉异常,作用是,要操作的目标文件被占用,即其他软件使用此文件时,给出错误提示

StreamWriter 写入器,简化FileStream用法的字节字符串转换等繁琐过程
但是,FileStream 带有对文件操作的模式FileMode的优点不可取代
两者结合取精去粕:

/// 
 /// 写入器向文件写入字符串
 /// 
 /// 目标文件路径
 /// 写入内容
 public void WiterFile(string path,string strToSave)
 {
     //文件流用以制定文件操作模式
     FileStream fs = new FileStream(path, FileMode.Open);

     //Encoding.Default 默认UTF-8格式
     StreamWriter sw = new StreamWriter(fs, Encoding.Default);

     sw.Write(strToSave);

     //关闭写入器,关闭文件流;  遵循“先打开的后关闭”原则
     sw.Close();
     fs.Close();
 }

注: sw.Close(); fs.Close();
关闭写入器,关闭文件流; 遵循“先打开的后关闭”原则

StreamReader读取器 (同写入器)
StreamReader sr = new StreamReader();
sr.ReadeLine();
sr.ReadeToEnd();
sr.Close();

3、常用文件操作

OpenFileDialog 打开选择文件的对话框
DialogResult 获取文件选择对话框的结果OK/Cancel

/// 
/// 打开文件对话框
/// 
OpenFileDialog ofDlg = new OpenDialog();   //打开文件对话框类

//自定义的文件管理类
FileManager fm = new FileManager();

//窗体应用程序按钮点击事件
private void openNotePad_Click(object senger,EventArgs e)
{
	//选择磁盘上的文件,并把文件里的信息在记事本上显示出来
	//Filter 过滤文件
	ofDlg.Filter ="文本文件(*.txt)|*.txt";
	//对话框返回结果类
	DialogResult ret = ofDlg.ShowDialog();
	if(ret == System.Window.Forms.DialogResult.OK)
	{
		string path = ofDlg.FileName;
		string content = fm.OpenFile(path);
		this.txtContent.Text = content;
	}
}

3、C#解决乱码

两种方式解决乱码:
Encoding.GetEncoding("ASCII")
Encoding.ASCII 静态方式
预防出现乱码,读取器/写入器中参数制定编码格式:Encoding.Default,默认即UTF-8格式;

读取器StreamReader 默认UTF-8格式;
写入器StreamWriter 默认UTF8Encoding的实例方法来指定编码转换格式
UTF8Encoding encoding = newUTF8Encoding();
string content = encoding.GetString(bArray);

你可能感兴趣的:(C#)