今日份主要内容:文件操作相关
-
文件相关类:File类,FileInnfo类
-
路径类:Path类
-
盘符类:DriverInfo类
-
目录类:Directory类,DirectoryInfo类
-
文件的输入与输出类:FileStream类,MemoryStream类,StreamReader类,StreamWriter类,StringReader类,StringWriter类
常用文件类概述
文件、目录(文件夹)、路径输入及输出常用的类有: File,FileInfo,Directory,DirectoryInfo,Path,DriveInfo。
可查看官方文档:F1或fn+F1
Path类提供对文件路径的相关操作。
DriveInfo类提供对有关驱动器(盘符)的信息的访问。
文件输入或输出流相关类:
FileStream类,MemoryStream类,StreamReader类,StreamWriter类,StringReader类,StringWriter类
本篇文章主要介绍1,2。
File类,FileInnfo类
在 C# 中,File类和FileInfo类都用于处理文件操作。
File类提供了一系列的静态方法,用于对文件进行操作,例如创建、删除、移动、复制文件等。这些方法使用起来比较方便直接,但每次调用都会进行一些安全检查和权限验证等操作,可能会有一定的性能开销。
FileInfo类则是表示文件的一个实例对象。通过创建FileInfo 对象,可以对特定的文件进行更细致和灵活的操作。它具有一些属性和方法来获取文件的详细信息,并执行一些文件操作。
File类和FileInfo类都是提供用于创建、复制、删除、移动和打开单一文件的方法,并协助创建 FileStream 对象。
File类是静态类。FileInfo类是密封类。FileInfo类和File类的API相似度高,使用比File类灵活。
例如:
using System.IO;
// 使用 File 类创建新文件
File.Create("example.txt");
// 使用 FileInfo 类操作文件
FileInfo fileInfo = new FileInfo("example.txt");
if (!fileInfo.Exists)
{
fileInfo.Create();
}
文件输入和输出类规律:以Info以尾可以实例化,不带Info的是静态类,如:File是静态类,FileInfo可以实例化。
创建文件
// 1.创建文件
private void button1_Click(object sender, EventArgs e)
{
// 路径
string path = @"C: \Users\Administrator\Desktop\C#\输入输出\1.文件操作\"; //这里填写要创建文件的路径,不包括文件名。
// 文件名
string fileName = "b.txt";
// 文件的完整路径
string fullPath = Path.Combine(path, fileName);
// 文件流,流要打开,记得关闭。建议使用using子句。流====》计算机中二进制流
//FileStream fs = File.Create(fullPath, 100, FileOptions.None, new System.Security.AccessControl.FileSecurity()); FileOption枚举值;这是要传一个类,要new一下。
/*FileStream fs = File.Create(fullPath); //这里Create()返回了一个FileStream 类型的文件。可以设置一个值去接收下这个文件。不想管什么类型的时候,FileStream可以写成var。
// 创建编码,为了得了字节,向流只能写入字节
Encoding encoding = Encoding.UTF8;
Encoding encoding1 = Encoding.GetEncoding("UTF-8");
byte[] bytes = encoding1.GetBytes("hello file55555");
fs.Write(bytes, 0, bytes.Length);
通过编码,让字节数组byte[]转换成字符串。
// 关闭流,防止忘记
fs.Close();*/
// using子句,自动帮开发者关闭流。这个CreatText()返回了一个StreamWrite 的文件类型。
using (StreamWriter sw = File.CreateText(fullPath))
{
// StreamWriter功能比FileStream单一些,但使用方便,可以直接写入字符串,而FileStream要求写入byte[]
sw.Write("hello");
sw.Write(" world");
sw.WriteLine("中文");
};
}
路径前面加一邮箱符号,可以不用写双斜杠。
-
怎么找路径?
-
右键单击项目名字,选择在文件资源管理器中打开文件夹。
-
文件流打开之后不要忘记关闭,不关闭就一直占用内存。
-
fs.Write(); fs.Close();
重命名文件
// 2.重命名文件
private void button2_Click(object sender, EventArgs e)
{
// 源文件,即重命名前的文件
string fileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\b.txt";
// 目标文件,即重命名后的文件
string newFileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\bb.txt";
// 目标文件存在时,先删除
if (File.Exists(newFileName))
{
// 确保重命名后的文件不存在。
File.Delete(newFileName);
}
// 再通过移动实现重命名
File.Move(fileName, newFileName);
}
复制文件
// 3.复制文件
private void button3_Click(object sender, EventArgs e)
{
// 源文件,即复制前的文件
string sourceFileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a.txt";
// 目标文件,即复制后的文件
string newFileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a1.txt";
// Exists()判断文件是否存在,复制文件时,不允许覆盖同名文件,即源文件存在,目标文件不存在。
if (File.Exists(sourceFileName) && !File.Exists(newFileName))
{
// 复制文件时,不允许覆盖同名文件
File.Copy(sourceFileName, newFileName);
}
}
创建并写入文件
// 5.创建并写入文件
private void button5_Click(object sender, EventArgs e)
{
string filename = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a2.txt";
File.WriteAllText(filename, "你好!abc123"); // 创建文件,并写入内容
File.AppendAllText(filename, "hello world"); // 追加内容,追加和写入不太一样,写入会替换原来的内容。
// AppendText()也会追加内容,需要引用流来使用。
using (var sw = File.AppendText(filename))
{
sw.WriteLine("HELLO WORLD1");
sw.WriteLine("HELLO WORLD2");
};
}
打开文件,读取文件
private void button6_Click(object sender, EventArgs e)
{
// 打开的文件路径
string filename = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a2.txt";
// 打开方式:Open只打开,文件权限:Read,Write,ReadWrite
using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite))
{
// 知道读取的字节数 1024不准确。fs.Length流中字节数
byte[] bytes = new byte[fs.Length];
// 把流中的内容读取byte[]中。Read()在读取大量内容,会阻塞。大量内容读取,建议使用ReadAsync()
int count = fs.Read(bytes, 0, bytes.Length);
// 把byte[]转换成字符串,才真正拿到内容。
string result = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
richTextBox1.Text = result;
};
}
-
写异步的时候,建议使用Async结尾的方法,好处不阻塞。
-
也可以用begin,end,但这种方法比较古老,不建议使用。
选择文件
private void button7_Click(object sender, EventArgs e)
{
DialogResult dialogResult = openFileDialog1.ShowDialog();
if (dialogResult == DialogResult.OK) // 选择文件
{
string fileName = openFileDialog1.FileName;
Debug.WriteLine(fileName);
// ReadAllText()读取所有的文本,返回字符串,也会阻塞。
//string content = File.ReadAllText(fileName);
//richTextBox1.Text = content;
// File静态文件类,FileInfo实例文件类
FileInfo file = new FileInfo(fileName);
Debug.WriteLine(file.FullName);
Debug.WriteLine(file.Name);
// 文件创建时间
Debug.WriteLine(file.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"));
// 文件修改时间
Debug.WriteLine(file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"));
// 文件最后一次访问时间
Debug.WriteLine(file.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss"));
// 文件的后缀名:.txt 媒体类型:https://www.runoob.com/http/mime-types.html
//媒体类型MIME 文件后缀名 .txt 扩展名Extension
Debug.WriteLine(file.Extension);
Debug.WriteLine(Path.GetFileName(fileName));
Debug.WriteLine(Path.GetFileNameWithoutExtension(fileName));
Debug.WriteLine(Path.GetExtension(fileName));
Debug.WriteLine(file.Attributes.ToString().Trim());
// 拿文件类型
if (file.Extension == ".txt")
{
Debug.WriteLine("文本文件");
}
// 文件大小
Debug.WriteLine(Math.Ceiling(file.Length / 1024M).ToString("N0"));
}
}
File类常用API
追加文本:AppendText(),AppendAllLines(),AppendAllText()
复制文件:Copy()
创建文件:Create(),CreateText()
删除文件:Delete()
移动文件:Move()
打开文件:Open(),OpenRead(),OpenText(),OpenWrite()
替换文件:Replace()
读取文件:ReadAllBytes(),ReadAllLines(),ReadAllText(),ReadLines()
写入文件:WriteAllBytes(),WriteAllLines(),WriteAllText()
判断文件是否存在:Exists()
加密及解密:Encrypt(),Decrypt()
读写文件:
- 需要流(最常用FileStram,也有可能是其他的流,如:StreamWriter等)
- 需要操作流的API(读写的API)
- 不要忘记关闭流。