首先声明,笔者的技术能力有限,所以这篇关于Io的读写文章介绍有比较浅显,大神可直接略过,在使用IO流读写文件以前,我们先简单介绍一下Io下面的一些类
FileInfo与File类
首先两者都是用于对文件的操作,区别在于FileInfo是普通类需要实例化使用,而File类是静态类,不需要实例化就可以使用,下面简单写个例子。
“`
class Program
{
static void Main(string[] args)
{
//在这里可以看到使用FileInfo需要先实例化一个file
FileInfo file = new FileInfo(@”E:\学习笔记\C#平台\test.txt”);//创建文件
Console.WriteLine(“创建时间:” + file.CreationTime);
Console.WriteLine(“路径:” + file.DirectoryName);
//使用StreamWriter 操作文本
StreamWriter sw = file.AppendText();//打开追加流
sw.Write(“李志伟”);//追加数据
sw.Dispose();//释放资源,关闭文件
//使用File时无需实例化,可以直接使用
File.Move(file.FullName, @”E:\学习笔记\test.txt”);//移动
Console.WriteLine(“完成!”);
Console.Read();
}
}
**DirectoryInfo与Directory类**
和操作文件一样,两者的区别也一个是需要实例化,一个不需要,这个类里的方法主要用作操作文件夹,代码展示
class Program
{
static void Main(string[] args)
{
//创建文件夹 初始化时制定路径和文件夹名称
DirectoryInfo directory = new DirectoryInfo(@”E:\学习笔记\C#平台\test”);
directory.Create();
Console.WriteLine(“父文件夹:” + directory.Parent.FullName);
//输出父目录下的所有文件与文件夹
FileSystemInfo[] files = directory.Parent.GetFileSystemInfos();
foreach (FileSystemInfo fs in files)
{
Console.WriteLine(fs.Name);
}
Directory.Delete(directory.FullName);//删除文件夹
Console.WriteLine(“完成!”);
Console.Read();
}
}
**Path类**
C#中的Path类仅仅是对 路径字符串 操作,并不真正的修改文件,属于静态类,可以直接调用其方法使用
例如Path.GetFileName(String) 用于返回指定路径字符串的文件名和扩展名。代码示例
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Path.Combine(@”E:\学习笔记\C#平台”, @”Test\Test.TXT”));//连接
Console.WriteLine(“平台特定的字符:” + Path.DirectorySeparatorChar);
Console.WriteLine(“平台特定的替换字符:” + Path.AltDirectorySeparatorChar);
Console.Read();
}
}
**DriveInfo类**
需要在引用System.IO.DriveInfo,提供对有关驱动器的信息的访问。例如DriveInfo.DriveType获取驱动器类型,如 CD-ROM、可移动、网络或固定,示例代码,获取当前电脑的所有盘符信息
class Program
{
static void Main(string[] args)
{
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo d in drives)
{
if (d.IsReady)
{
Console.WriteLine(“总容量:” + d.TotalFreeSpace);
Console.WriteLine(“可用容量:” + d.AvailableFreeSpace);
Console.WriteLine(“驱动器类型:” + d.DriveFormat);
Console.WriteLine(“驱动器的名称:” + d.Name + “\n”);
}
}
Console.WriteLine(“OK!”);
Console.Read();
}
}
好了介绍了这么多,终于开始今天的正式大餐了,使用上述的类和方法对文件进行操作、
**移动、复制、删除文件**
class Program
{
static void Main(string[] args)
{
// 创建到当前相对路径下也可以
//指定文件存放位置@“E:/su/text.txt”
string path = AppDomain.CurrentDomain. BaseDirectory+”/Request.txt”
File.WriteAllText(path, “测试数据”);
Console.WriteLine(“文件已创建,请查看!”);
Console.ReadLine();
File.Move(path, “移动路径”);
Console.WriteLine(“移动完成,请查看!”);
Console.ReadLine();
File.Copy(@”复制文件保存路径”, path);
Console.WriteLine(“文件已复制,请查看!”);
Console.ReadLine();
File.Delete(path);
File.Delete(@”E:\学习笔记\Test.txt”);
Console.WriteLine(“文件已删除,请查看!\nOK!”);
Console.Read();
}
}
**判断是文件还是文件夹**
很简单,无需解释
class Program
{
static void Main(string[] args)
{
IsFile(@”E:\学习笔记\C#平台\Test.txt”);
IsFile(@”E:\学习笔记\”);
IsFile(@”E:\学习笔记\XXXXXXX”);
Console.Read();
}
//判断路径是否是文件或文件夹
static void IsFile(string path)
{
if (Directory.Exists(path))
{
Console.WriteLine(“是文件夹!”);
}
else if (File.Exists(path))
{
Console.WriteLine(“是文件!”);
}
else
{
Console.WriteLine(“路径不存在!”);
}
}
}
**读写文件与数据流**
读取文件
class Program
{
static void Main(string[] args)
{
string path = @”E:\学习笔记\C#平台\Test.txt”;
//按字节读取 把读取的内容放到字节数组保存
byte[] b = File.ReadAllBytes(path);
Console.WriteLine(“ReadAllBytes读二进制:”);
foreach (byte temp in b)
{
Console.Write((char)temp+” “);
}
string[] s = File.ReadAllLines(path, Encoding.UTF8);
Console.WriteLine(“\nReadAllLines读所有行:”);
foreach (string temp in s)
{
Console.WriteLine(“行:”+temp);
}
//读取整个文本
string str = File.ReadAllText(path, Encoding.UTF8);
Console.WriteLine(“ReadAllText读所有行:\n” + str);
Console.Read();
}
}
写文件
class Program
{
static void Main(string[] args)
{
string path = @”E:\学习笔记\C#平台\Test.txt”;
//字节以二进制的方法写入
File.WriteAllBytes(path,new byte[] {0,1,2,3,4,5,6,7,8,9});//写入二进制
Console.WriteLine(“WriteAllBytes写入二进制成功”);
Console.ReadLine();
string[] array = {“123”,”456”,”7890”};
File.WriteAllLines(path, array, Encoding.UTF8);//写入所有行
Console.WriteLine(“WriteAllLines写入所有行成功”);
Console.ReadLine();
//写入字符串
File.WriteAllText(path, “abcbefghijklmn”,Encoding.UTF8);//写入字符串
Console.WriteLine(“WriteAllText写入字符串成功\nOK!”);
Console.Read();
}
}
接下来学习一下刚才在写入当中所用到的数据流
最常用的流类如下:
FileStream: 文件流,可以读写二进制文件。
StreamReader: 流读取器,使其以一种特定的编码从字节流中读取字符。
StreamWriter: 流写入器,使其以一种特定的编码向流中写入字符。
BufferedStream: 缓冲流,给另一流上的读写操作添加一个缓冲层。
![数据流的层次结构](https://img-blog.csdn.net/20170124004859697?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTc2NTI2NjYxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
**使用FileStream读写二进制文件**
class Program
{
static void Main(string[] args)
{
string path = @”E:\学习笔记\C#平台\Test.txt”;
//以写文件的方式创建文件
FileStream file = new FileStream(path, FileMode.CreateNew, FileAccess.Write);
string str = “测试文件–李志伟”;
byte[]bytes=Encoding.Unicode.GetBytes(str);
file.Write(bytes, 0, bytes.Length);//写入二进制 //流用完要关闭 Dispose关闭方法
file.Dispose();
Console.WriteLine(“写入数据成功!!!”);
Console.ReadLine();
//以读文件的方式打开文件
file = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] temp = new byte[bytes.Length];
file.Read(temp, 0, temp.Length);//读取二进制
Console.WriteLine(“读取数据:” + Encoding.Unicode.GetString(temp));
file.Dispose();
Console.Read();
}
}
**StreamWriter与StreamReader**
使用StreamWriterStreamReader就不用担心文本文件的编码方式,所以它们很适合读写文本文件。
class Program
{
static void Main(string[] args)
{
string path = @”E:\学习笔记\C#平台\Test.txt”;
//以写文件的方式创建文件
FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(file);
sw.WriteLine(“测试文件–李志伟”);
sw.Dispose();
Console.WriteLine(“写入数据成功!!!”);
Console.ReadLine();
//以读文件的方式打开文件
file = new FileStream(path, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(file);
Console.WriteLine(“读取数据:”+sr.ReadToEnd());
sr.Dispose();
Console.Read();
}
}
**映射内存的文件**
**MemoryMappedFile类**
应用程序需要频繁地或随机地访问文件时,最好使用MemoryMappedFile类(映射内存的文件)。使用这种方式允许把文件的一部分或者全部加载到一段虚拟内存上,这些文件内容会显示给应用程序,就好像这个文件包含在应用程序的主内存中一样。
class Program
{
static void Main(string[] args)
{
MemoryMappedFile mmfile = MemoryMappedFile.CreateFromFile(@”E:\Test.txt”, FileMode.OpenOrCreate, “MapName”, 1024 * 1024);
MemoryMappedViewAccessor view = mmfile.CreateViewAccessor();//内存映射文件的视图
//或使用数据流操作内存文件
//MemoryMappedViewStream stream = mmfile.CreateViewStream();
string str = “测试数据:李志伟!”;
int length = Encoding.UTF8.GetByteCount(str);
view.WriteArray(0, Encoding.UTF8.GetBytes(str), 0, length);//写入数据
byte[] b = new byte[length];
view.ReadArray(0, b, 0, b.Length);
Console.WriteLine(Encoding.UTF8.GetString(b));
mmfile.Dispose();//释放资源
Console.Read();
}
}
“`