1.文件操作的核心类 .net framerwork提供的文件操作基本都在
system.io命名空间下。
C#学了之后感觉比c++用起来方便很多。c++如果融入更多好的工具包多好。
2.File类
FILE 的方法都是静态的效率高。相对Fileinfo
class Program
{
static void Main(string[] args)
{
FileStream fs = null;
StreamWriter writer = null;
string path = "D:\\test.txt";
if(!File.Exists(path))
{
fs = File.Create(path);
Console.WriteLine("新建一个文件:{0}", path);
}
else
{
fs = File.Open(path, FileMode.Open);
Console.WriteLine("文件存在,直接打开!");
}
writer = new StreamWriter(fs);
writer.WriteLine("测试文本");
Console.WriteLine("向测试文件写入数据");
writer.Flush();
writer.Close();
Console.WriteLine("关闭数据流!");
Console.ReadKey();
}
}
3.Directory 和DirctoryInfo类
2个类包含了创建,移动,删除,枚举目录和子目录成员。
class Program
{
static void Main(string[] args)
{
string dir_path = "D:\\DirectoryPath";
string file_path = string.Format("{0}\\{1}",dir_path,"test.txt");
if(!Directory.Exists(dir_path))
{
Directory.CreateDirectory(dir_path);
Console.WriteLine("新建一个目录:{0}", dir_path);
}
else
{
Console.WriteLine("目录存在,直接打开!");
}
FileInfo file = new FileInfo(file_path);
if(!file.Exists)
{
file.Create();
Console.WriteLine("新建文件{0}!",file_path);
}
else
{
Console.WriteLine("文件 :{0} 存在!", file_path);
}
Console.ReadKey();
}
}
4.Stream 流
文件操作离不开流相关操作
流(stream)可以理解为内存中的字节序列。
stream是所有流的抽象基类,比如FileStrem类就表示 文件 这种存储实体。
3个基本操作
1.对流进行读取-把流中的数据读取到具体的数据结构中(如数组)
2.对流进行写入-把数据结构中的数据写入到流中。
3.对流进行查找-对流内当前位置进行查询和修改。
下面用到using(){}简单解释一下
using(){}作为语句,用于定义一个范围,在此范围的末尾将释放对象。
using 语句允许程序员指定使用资源的对象应当何时释放资源。using 语句中使用的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。
还会用到 using System.Text; 后面再讲
class Program
{
static void Main(string[] args)
{
string file_path = "D:\\test.txt";
using (FileStream file_stream = File.Open(file_path, FileMode.OpenOrCreate))
{
string msg = "hello world !";
byte[] msgAsbyteArray = Encoding.Default.GetBytes(msg);
file_stream.Write(msgAsbyteArray, 0, msgAsbyteArray.Length);
file_stream.Seek(0, SeekOrigin.Begin);
Console.WriteLine("写入文件的数据为:");
byte[] byte_from_file = new byte[msgAsbyteArray.Length];
file_stream.Read(byte_from_file, 0, msgAsbyteArray.Length);
Console.WriteLine(Encoding.Default.GetString(byte_from_file));
Console.ReadKey();
}
}
}
streamReader 和 StreamWriter 使用
class Program
{
static void Main(string[] args)
{
string file_path = "D:\\test.txt";
using (FileStream file_stream = File.Open(file_path, FileMode.OpenOrCreate))
{
string msg = "hello world ...!";
StreamWriter stream_write = new StreamWriter(file_stream);
Console.WriteLine("开始写入文件{0}", msg);
stream_write.Write(msg);
StreamReader stream_reader = new StreamReader(file_stream);
string read_file = stream_reader.ReadToEnd();
Console.WriteLine("文件{0}数据\n", read_file);
stream_write.Close();
stream_reader.Close();
Console.ReadKey();
}
}
}
5.对文件进行异步操作
FileStream类有15个构造函数,只有一个可以进行异步操作
FIleStream(string path,Filemode mode,FIleAccess access,FIleShare share,in bufferSize,bool useAsync);
对文件的异步操作使用BeginRead 和 BeaginWite 方法
class Program
{
static void Main(string[] args)
{
string file_path = "D:\\test.txt";
FileStream file_stream = null;
FileInfo file_info = new FileInfo(file_path);
if(!file_info.Exists)
{
file_stream = File.Create(file_path);
Console.WriteLine("新建文件夹:{0}", file_path);
file_stream.Close();
}
else
{
Console.WriteLine("文件夹存在:{0}", file_path);
}
file_stream = new FileStream(file_path, FileMode.Open, FileAccess.Write, FileShare.None, 4096, true);
Console.WriteLine("开启异步操作{0}", file_stream.IsAsync);
string msg = "hello world async!";
byte[] buffer = Encoding.UTF8.GetBytes(msg);
//开始异步操作
IAsyncResult asyncResult = file_stream.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(EndWriteCallBack), file_stream);
Console.WriteLine("开始异步操作,请稍后...");
Console.Read();
}
//异步操作完成后调用
static void EndWriteCallBack(IAsyncResult asyncResult)
{
Console.WriteLine("异步写入开始...");
FileStream stream = asyncResult.AsyncState as FileStream; // 转类型 变为FileStream
if(stream != null)
{
stream.EndWrite(asyncResult);
stream.Close();
}
Console.WriteLine("异步写入完毕!");
}
}
//没有按实际的顺序输出,后面再看看。应该会先打印"开始异步操作"才对.