文本文件的读写
文件是记录在外部介质上的数据的集合。Visual Studio中与文件操作有关的类在命名空间System.IO中,因此在程序的开头需要引入这个命名空间。
读写文件
- 引入名字空间
using System.IO;
- 写文件用StreamWriter方法
StreamWriter swFile = new StreamWriter("C:\\MyFile.txt");
StreamWriter swFile = new StreamWriter("C:\\MyFile.txt",True);
常用方法
Write方法:调用StreamWriter对象的Write方法,可以往文件中写入一个字符串。
WriteLine方法:调用StreamWriter的WriteLine方法,可以往文件中写入一个字符串和一个换行符(写入一行)。
Close方法:释放StreamWriter对象,并关闭打开的文件。
例子
StreamWriter swFile = new StreamWriter("C:\\MyFile.txt");
swFile.WriteLine("君为女萝草,妾作菟丝花。");
swFile.WriteLine("轻条不自引,为逐东风斜。");
swFile.Close();
- 读文件用StreamReader方法
常用方法
Read 方法:从文件(流)中读入下一个字符
ReadLine方法:从文件(流)中读入下一行字符
Close方法:关闭打开的文件(流)
ReadToEnd方法:从文件(流)的当前位置读到文件(流)的结尾
Peek方法:返回文件(流)中的下一个字符,但并不读入该字符
StreamReader srFile =new StreamReader("C:\\MyFile.txt");
String strIn;
While(srFile.Peek()>-1)
{
strIn += srFile.ReadLine();
}
读写二进制文件
- FileStream对象-打开或创建文件(只提供了字节的写入方式)
构造函数
//path用于指定要打开或创建文件的路径及文件名
//mode用于指定文件打开的模式,可以是Creat(创建)Open(打开)等
//access用于指定文件访问的目的,可以是Read(读)Write(写)和ReadWrite(读写)
public FileStream(String path,FileMode mode,FileAccess access);
常用方法
Read和Write方法:对文件进行读写
//array Byte型数组,存放准备写入文件流的数据,或是从文件流中读出的数据
//offset准备从数组中向文件写入或读出的数据在数组中的偏移量
//count写入或读出的最大字节数
override int Read(unsigned char[] array,int offset,int count);
ReadByte和WriteByte方法:一次向文件流中读出或写入一个字节
override void WriteByte(Byte value);
override int ReadByte();
Close方法:关闭或打开文件
Seek方法:在文件流中定位
//offset指定相对于origin的移动偏移量
//origin指定指针移动方向,可以有三种选择
Begin从文件头往后开始移动指针
Current从文件的当前位置往后开始移动指针
End从文件尾往前开始移动指针
override long Seek(long offset,SeekOrigin origin);
- BinaryWriter和BinaryReader对象(二进制写类和二进制写类)
在构造了FileStream对象后可以将该对象进一步构造为BinaryWriter和BinaryReader对象,以获取更高级的功能。需要从一个存在的流来构造BinaryWriter和BinaryReader对象,例如:
FileStream fsRW = new FileStream("E:\\MyFile.bin",FileMode.Open,FileAccess.Read);
BinaryWriter bwMyFile = new(fsRW);
BinaryWriter写入方法
void Write(Boolean):将1字节Boolean值写入当前流
void Write(Byte):将一个无符号字节写入当前流
void Write(Char()): 将字符数组写入当前流
void Write(Decimal):将一个十进制数值写入当前流
void Write(Double):将8字节浮点值写入当前流
void Write(Short):将2字节有符号整数写入当前流
void Write(Integer):将4字节有符号整数写入当前流
void Write(Long):将8字节有符号整数写入当前流
BinaryReader读入方法
ReadBoolean:从当前流中读取 Boolean
ReadByte:从当前流中读取下一个字节
ReadBytes:从当前流中将 count个字节读入字节数组
ReadChar:从当前流中读取下一个字符
ReadDecimal;从当前流中读取十进制数值
ReadDouble:从当前流中读取8字节浮点值
ReadSingle:从当前流中读取4字节浮点值
ReadString:从当前流中读取一个字符串。字符串有长度前缀,一次7位地被编码为整数。
序列化对象
序列化对象表示为字节序列,包括对象数据和关于对象类型及对象中所存放数据类型的信息。序列化对象写入文件后,可以从文件读取并去序列化,即用对象类型及对象中所存放数据类型的信息在内存中重建对象。
方法
BinaryFormatter类:可以读取和写入流中的整个对象。Serialize将对象表示写入文件(序列化),Deserialize读取这个表示并重建对象(去序列化)。
文件和目录的操作
目录操作
Directory类
主要是Directory类,提供了操作一个目录所需要的大部分方法,Directory类中的方法全部是静态的,因此无需生成Directory的实例便可使用这种方法。
常用的方法
- CreateDirectory(string Path):该方法按照Path所指定的路径创建一个新的目录。如果Path指定的路径格式不对,或者不存在等错误均会引发异常。最好将该方法置于try语句中。
- Delete(string Path, bool recursive):该方法删除Path所指定的目录。如果recursive为false,则仅当目录为空时删除改目录。若为true,则删除目录下的所有子目录和文件。
- Exists(string Path):该方法测试Path所指定的目录是否存在。若存在,则返回true。反之返回false。
- GetDirectories(string Path):该方法得到Path所指定的目录中包含的所有子目录。结果已字符串数组的形式返回,数组中的每一项对应一个子目录。
- GetFiles(string Path):该方法和GetDirectories方法类似,返回目录中所有的文件名。
- Move( string sourceDirName,string destDirName):该方法将一个目录中的内容移动到一个新的位置。sourceDirName指定要移动的目录,destDirName指定移动到何处。
- GetLogicalDrives():返回计算机中的所有逻辑驱动器名称。
- Copy(string sourceFileName,string destFileName):sourceFileName指出要复制文件的文件名以及该文件的路径,destFileName指出新的副本的文件名可以带有路径。但destFileName不能是一个目录或者一个以存在的文件。
- Delete(string path):删除一个文件。path指出该文件名和路径。
- Exists(string path):As Boolean测试path指定的文件是否存在。若是,返回true,否则返回false。
- Move(string sourceFileName,string destFileName):将文件由位置sourceFileName处移动到新位置destFileName处。
- GetCreationTime(string path As String):返回由path所指定文件的创建日期和时间。类似的还
- GetLastAccessTime,返回上次访问指定文件的日期和时间。GetLastWriteTime返回上次写入指定文件或目录的日期和时间。
Path类
对文件的路径进行修改
常用方法
- ChangeExtension:更改路径字符串的扩展名。
- Combine(String[]):将字符串数组组合成一个路径。
- GetDirectoryName:返回指定路径字符串的目录信息。
- GetExtension:返回指定的路径字符串的扩展名。
- GetFileName:返回指定路径字符串的文件名和扩展名。
- GetFileNameWithoutExtension:返回不具有扩展名的指定路径字符串的文件名。
- GetFullPath:返回指定路径字符串的绝对路径。
- GetTempFileName:创建磁盘上唯一命名的零字节的临时文件,并返回该文件的完整路径。
- GetTempPath:返回当前用户的临时文件夹的路径。
例题-写入读取文本文件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; //首先需要添加IO的库,才能够读写文件
namespace TextFile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonWrite_Click(object sender, EventArgs e) //写入
{
SaveFileDialog sfDialog = new SaveFileDialog();
sfDialog.Filter = "TEXT|*.txt"; //过滤器,只能存txt格式的文件
string fileName;
if(sfDialog.ShowDialog()==DialogResult.OK) //当按键按下时
{
fileName = sfDialog.FileName;
StreamWriter stWriter = new StreamWriter(fileName); //用户选择的名字通过构造函数打开
stWriter.Write(textBox1.Text); //存入的文字为文本框内的文字
stWriter.WriteLine("");
stWriter.Close(); //最后要关闭文件才能保存
}
}
private void buttonRead_Click(object sender, EventArgs e) //读出
{
OpenFileDialog ofDialog = new OpenFileDialog();
ofDialog.Filter = "TEXT|*.txt";
if(ofDialog.ShowDialog()== DialogResult.OK)
{
StreamReader stReader = new StreamReader(ofDialog.FileName);
textBox1.Text = stReader.ReadToEnd();
stReader.Close();
}
}
}
}
例题-读写二进制文件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; //首先需要添加IO的库,才能够读写文件
namespace TextFile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonWrite_Click(object sender, EventArgs e) //写入
{
SaveFileDialog saDialog = new SaveFileDialog();
if (saDialog.ShowDialog() == DialogResult.OK)
{
//构造FileStream对象
FileStream fs = new FileStream(saDialog.FileName, FileMode.Create, FileAccess.Write);
//需要从一个存在的流来构造BinaryWriter和BinaryReader对象
BinaryWriter bw = new BinaryWriter(fs);
var firstInt = Convert.ToInt32(textBox1.Text);
var secondDouble = Convert.ToDouble(textBox3.Text);
bw.Write(firstInt);
bw.Write(secondDouble);
bw.Write(textBox2.Text);
bw.Close();
}
}
private void buttonRead_Click(object sender, EventArgs e) //读出
{
OpenFileDialog op = new OpenFileDialog();
if (op.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(op.FileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
var firstInt = br.ReadInt32();
var secondDouble = br.ReadDouble();
var str = br.ReadString();
textBox1.Text = firstInt.ToString();
textBox3.Text = secondDouble.ToString();
textBox2.Text = str;
br.Close();
fs.Close();
}
}
}
}
例题-序列化和去序列化
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; //
using System.Runtime.Serialization.Formatters.Binary; //二进制时需要加该库
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
MyData mydata = new MyData(); //创建class类的实例
private void buttonwrite_Click(object sender, EventArgs e)
{
mydata.first = Convert.ToInt32(textBox1.Text);
mydata.second = Convert.ToDouble(textBox2.Text);
mydata.str = textBox3.Text;
//创建文件流
FileStream fs = new FileStream("d:\\mydata.da",FileMode.Create,FileAccess.Write);
//二进制格式化流
BinaryFormatter bf = new BinaryFormatter();
//调用序列化函数
bf.Serialize(fs, mydata);
fs.Close();
}
private void buttonread_Click(object sender, EventArgs e)
{
MyData mydata2 = new WindowsFormsApplication2.MyData();
FileStream fs = new FileStream("d:\\mydata.da", FileMode.Open, FileAccess.Read);
BinaryFormatter bf = new BinaryFormatter();
//去序列化
mydata2 = (MyData)bf.Deserialize(fs);
//显示到文本框中
textBox1.Text = mydata2.first.ToString();
textBox2.Text = mydata2.second.ToString();
textBox3.Text = mydata2.str;
fs.Close();
}
}
//标记这个类是可序列化的,读写要按一定的顺序
[Serializable]
public class MyData //将整个class作为对象存到磁盘上,是可序列化的
{
public int first;
public double second;
public string str;
}
}