FileStream 类是公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。 命名空间:System.IO
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
filePath 提供待读取文件的路径
FileMode 枚举定义了各种打开文件的方式
Append:打开一个已有文件,并将光标放置在文件的末尾。如果文件不存在,则创建文件;
Create:创建一个新的文件。如果文件已存在,则删除旧文件,然后创建新文件;
CreateNew:指定操作系统应创建一个新的文件,如果文件已存在,则抛出异常;
Open:打开一个已有文件,如果文件不存在,则抛出异常;
OpenOrCreate:指定操作系统应打开一个已有的文件,如果文件不存在,则用指定名称创建一个新的文件打开;
Truncate:打开一个已有的文件,文件一旦打开,就将被截断为零字节大小。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。如果文件不存在,则抛出异常。
FileAccess 枚举定义了各种访问权限
Read:获得对文件的读取访问权限,进而可以从文件中读取数据(只读)。
ReadWrite:获得读取、写入文件的访问权限,进而可以从文件中读取、写入数据(可读可写)。
Write:获取对文件的写入访问权限,进而可以将数据写入文件中(只写)。
FileShare 枚举定义了对同一文件可以具有的访问类型
Inheritable:允许文件句柄可由子进程继承。
None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
Read:允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
ReadWrite:允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Write:允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Delete:允许随后删除文件。
在 C# 语言中,StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。
StreamReader 类的构造方法有很多,常用的构造方法有如下四种:
| 构造方法 | 说明 |
|---|---|
| StreamReader(Stream stream) | 为指定的流创建StreamReader类的实例 |
| StreamReader(string path) | 为指定路径的文件创建StreamReader类的实例 |
| StreamReader(Stream stream,Encoding encoding) | 用指定的字符编码为指定的流初始化StreamReader类的实例 |
| StreamReader(String path, Encoding encoding) | 用指定的字符编码为指定的文件初始化StreamReader类的实例 |
StreamReader类中常用的属性和方法如下:
| 属性或方法 | 作用 |
|---|---|
| Encoding CurrentEncoding | 只读属性,获取当前流中使用的编码方式 |
| bool EndOfSteam | 只读属性,获取当前的流位置是否在流结尾 |
| void Close() | 关闭流 |
| int Peek() | 获取流中的下一个字符的整数,如果没有获取到字符,则返回 -1。 |
| int Read() | 获取流中的下一个字符的整数 |
| int Read(char[] buffer, int index, int count) | 从指定的索引位置开始将来自当前流的指定的最多字符读进缓冲区 |
| string ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回 |
| string ReadToEnd() | 读取来自流的当前位置到结果的所有字符 |
先获取文件流,在通过文件流构造 StreamReader 来读取文件流,也可以通过路径直接构造 StreamReader 来读取文件流(参考下面写入文件流方式)。
class Program
{
static void Main(string[] args)
{
//文件路径
string filePath = Application.dataPath + "/Data/task.csv";
//按照文件路径打开获取文件流,并获取该文件流的编码格式
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
//使用文件流相应的字符编码格式来读取文件流
StreamReader streamReader = new StreamReader(fileStream);
//记录每次读取的一行记录
string strLine;
//逐行读取CSV中的数据
while ((strLine = streamReader.ReadLine()) != null)
{
//对数据进行操作
Console.WriteLine(strLine);
}
streamReader.Close();
}
}
在 C# 语言中,StreamWriter类用于向流中写入字符串。
StreamWriter 类的构造方法有很多,常用的构造方法有如下四种:
| 构造方法 | 说明 |
|---|---|
| StreamWriter(Stream stream) | 为指定的流创建StreamWriter类的实例 |
| StreamWriter(string path) | 为指定路径的文件创建StreamWriter类的实例 |
| StreamWriter(Stream stream,Encoding encoding) | 用指定的字符编码为指定的流初始化StreamWriter类的实例 |
| StreamWriter(String path, Encoding encoding) | 用指定的字符编码为指定的文件初始化StreamWriter类的实例 |
StreamWriter类中常用的属性和方法如下:
| 属性或方法 | 作用 |
|---|---|
| bool AutoFlush | 属性,获取或设置是否自动刷新缓冲区 |
| Encoding Encoding | 只读属性,获取当前流中使用的编码方式 |
| void Close() | 关闭流 |
| void Flush() | 刷新缓冲区 |
| int Write(char value) | 将字符写入流中 |
| void WriteLine(char value) | 将字符换行写入流中 |
| Task WriteAsync(char value) | 将字符异步写入流中 |
| Task WriteLineAsync(char value) | 将字符异步换行写入流中 |
直接通过路径直接构造 StreamWriter 来读取文件流,也可以先获取文件流,在通过文件流构造 StreamReader 来读取文件流(参考上面读取文件流方式)。
public void WriteCsv(string strs, string path)
{
if (!File.Exists(path))
{
File.Create(path).Dispose();
}
else
{
File.Delete(path);
File.Create(path).Dispose();
}
string mystr;
//UTF-8方式保存,true表示追加的写入方式,改成false就是直接覆盖写入
using (StreamWriter stream = new StreamWriter(path, true, Encoding.UTF8))
{
for (int i = 0; i < Data.SolList.Count; i++)
{
mystr = "";
Solution sol = Data.SolList[i];
//mystr保存一行数据,不同列的元素之间使用 "," 隔开
mystr = sol.SolutionID.ToString() + "," + sol.MakeSpan.ToString() + "," + sol.WaitTime.ToString() + "," + sol.Balance.ToString() + "," + sol.Category;
stream.WriteLine(mystr);
}
}
}