文件是什么?
文件是永久存储在磁盘等介质上的一组数据,每文件都有其唯一的文件名,操作系统通过唯一的文件名对文件进行管理。
一、System.IO模型
在.net中的System.IO(文件操作类库)模型提供了很多针对文件的、文件夹的操作,以流的方式对各种数据文件进行访问。
System.IO中包含的各种类,可用于文件的创建、读/写、复制、移动和删除等操作。
System.IO命名空间中常用到的类
| 类 | 说明 |
|---|---|
| Directory | 用于创建、移动目录和子目录,即文件夹 |
| File | 用于创建、复制、删除、移动和打开文件 |
| FileStream | 文件字节流,对文进行读取、写入、打开和关闭 |
| StreamWrite | 文本文件数据写入 |
| StreamReader | 文本文件数据读取 |
| … | … |
当然还有很多其它的,以上只列举几个平时我经常用到的。
1、Directory类
Directory类提供了对文件夹的各种操作方法
| 方法 | 说明 | 使用 |
|---|---|---|
| CreateDirectory | 创建所有目录或子目录 | Directory.CreateDirectory(@“f:new_directory”) |
| Delete | 从指定路径删除目录 | Directory.Delete(@“f:new_directory”,true) true,将删除整个目录;false,目录为空才删除 |
| Exists | 判断文件夹是否存在,返回布尔类型 | if (Directory.Exists(@“f:new_directory”)) |
| Move | 移动文件夹的位置 | Directory.Move() |
| GetFiles | 返回指定目录中的所有文件名称 | Directory.GetFiles() |
| GetDirectories | 返回指定目录中子目录的名称 | Directory.GetDirectories() |
| GetCreationTime | 返回指定目录的创建时间 | Directory.GetCreationTime() |
| … | … | … |
2、File类
Directory类提供了对文件的各种操作方法,协助创建FileStream类
| 方法 | 说明 | 使用 |
|---|---|---|
| Copy | 将现有文件复制到新文件中 | File.Copy(@“f:new_directoty1.txt”,@“f:new_directory2.txt”) |
| Create | 创建新的文件 | File.Create(@“f:new_directory”) |
| Delete | 从指定路径删除文件 | File.Delete(@“f:new_directory”) |
| Exist | 判断文件是否存在,返回布尔类型 | if (File.Exists(@“f:new_directory”)) |
| Move | 移动文件的位置,并提供指定新文件名 | File.Move(@“f:new_directory1.txt”,@“f:two_directory1.txt”) |
| Open | 打开指定路径上的FileStream | File.Open(@“f:new_directory1.txt”,FileMode.Append) |
| OpenRead | 打开现有文件进行读取 | File.OpenRead(@“f:new_directory1.txt”) |
| OpenWrite | 打开现有文件进行写入 | File.OpenWrite(@“f:new_directory1.txt”) |
| … | … | … |
3、FileStream类
FileStream类产生文件流,对文件进行读取、写入、打开和关闭等操作。其数据是字节流,只能进行字节的读写。
| 方法 | 说明 |
|---|---|
| Close? | 关闭当前文件流,并释放相关资源 |
| Flush | 清除文件流的所有缓冲区 |
| Lock | 防止其它进程更改FileStream |
| Read | 从流中读取数据,返回字节数组 |
| Seek | 将流当前的位置设置为定值 |
| Write | 使用从缓冲区读取的数据将字节写入该流 |
| … | … |
FileStream类还提供了很多构造函数
以public FileStream(string path, FileMode mode, FileAccess access, FileShare share);这个构造函数为例说一下
(string path、FileMode mode、FileAccess access、FileShare share,都为FileStream构造函数中的参数)
当前FileStream对象封装的文件的路径
②FileMode指定操作系统打开文件的方式
| 方法 | 说明 | 使用 |
|---|---|---|
| Append | 打开现有文件并查找到文件尾 | FileMode.Append |
| Create | 创建新文件,文件已存在则被改写 | FileMode.Create |
| CreateNew | 文件不存在时,创建新文件 | FileMode.CreateNew |
| Open | 打开现有文件 | FileMode.Open |
| OpenOrCreate | 如果文件存在,打开文件;不存在则新建文件 | FileMode.OpenOrCreate |
| Truncate | 打开现有文件,文件一旦打开,将被截断为零字节大小 | FileMode.Truncate |
| … | … | … |
定义文件的读取、写入/读写访问权限
| 方法 | 说明 | 使用 |
|---|---|---|
| Read | 文件的读访问 | FileAccess.Read |
| Write | 文件的写访问 | FileAccess.Write |
| ReadWrite | 文件的读写访问权限 | FileAccess.ReadWrite |
用于控制其它FileStream对象对同一文件可以具有的访问类型的常数。
| 方法 | 说明 | 使用 |
|---|---|---|
| None | 谢绝共享当前文件 | FileShare.None |
| Read | 允许打开文件读取 | FileShare.Read |
| Write | 允许打开文件写入 | FileShare.Write |
| ReadWrite | 允许打开文件读取或写入 | FileShare.ReadWrite |
| Delete | 允许随后删除文件 | FileShare.Delete |
| Inheritable | 使文件句柄可有子进程继承 | FileShare.Inheritable |
| … | … | … |
4、StreamReader类
文本数据的读取
| 方法 | 说明 |
|---|---|
| Close | 关闭StreamReader对象和基础流,释放资源 |
| Peek | 返回下一个可用的字符,但不使用它 |
| Read | 读取流的的下一个或下一组字符 |
| ReadLine | 从当前流读取一行字符,并将数据作为字符串返回 |
| ReadToEnd | 从流的当前位置到末尾读取流 |
| … | … |
5、StreamWrite类
文本数据的写入
| 方法 | 说明 |
|---|---|
| Close | 关闭当前的StreamWrite对象和流 |
| Write | 写入流 |
| WriteLine | 写入重载参数指定的某些数据,后跟行结束符 |
| … | … |
二、文件操作实例
对上述的各种类Directory、File、FileStream、StreamWriter进行实际运用
public class write_log
{
///
/// 写日志
///
/// 写入日志文件的信息
public static void write_log_to_f(string log_info)
{
//对写入txt文件的数据分行
log_info = "rn" + log_info;
//将日志文件的路径设为绝对路径【F:\My_Code\sqldemo_log】
string folder = "F:\My_Code\sqldemo_log";
//判断目录各文件夹【F:My_Codesqldemo_log】是否存在
if (!Directory.Exists(folder))
{
Directory.CreateDirectory(folder);//目录不存在则创建相应的目录
}
//string file_name = folder + "/" + DateTime.Now.ToShortDateString() + ".txt";
string file_name = folder + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
//判断文件夹下的文件是否存在【F:My_Codesqldemo_log2020-07-29.txt】
if (File.Exists(file_name))
{
FileStream fs = new FileStream(file_name, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
StreamWriter sr = new StreamWriter(fs);
sr.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "t" + log_info);
sr.Close();
fs.Close();
}
else
{
FileStream fs = new FileStream(file_name, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
StreamWriter sr = new StreamWriter(fs);
sr.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "t" + log_info);
sr.Close();
fs.Close();
}
}
}
三、测试
我还是用单元测试来吧
- 测试代码
public void write_log_to_fTest()
{
string log_info = "写入日志的测试 by 陈学姐";
write_log.write_log_to_f(log_info);
}
-
运行结果
-
相应路径下看一下文件中是否写入数据
代码中的路径:【“F:My_Codesqldemo_log” + “/” + DateTime.Now.ToString(“yyyy-MM-dd”) + “.txt”】
四、结束
小问题:
原本在代码中获取短时间我用的是DateTime.Now.ToShortDateString(),但是所显示的短日期格式却变成了“2020/07/29”,不是我预期的“2020-07-29”。
百度一下,发现ToShortDateString()的日期格式获取是由所处区域及人为设置影响的,可以进入【控制面板——时钟和区域——区域——格式】中进行设置。
【.net】C#关于如何创建文件、读取文件数据、向文件写数据,记录,打板!



