在C#编程环境中,当我们对电脑文件进行读写、移动、复制、删除等这些操作时,这些都可以在system.IO名称空间下,所以当我们想要通过C#编程语言对其进行操作时,需要添加该名称空间,它内部包含对数据流和文件进行同步或异步读取与写入操作。
先简单介绍几个文件操作类:
首先是file类:这是一个静态类,内部包含常见,复制,移动操作的一些静态方法,其内部包含众多的操作方法:
主要有copy:将现有文件复制到新文件;create:在指定路径中创建文件;delete:删除指定文件;exist:判断该文件是否存在;move:将指定文件移到新位置等这些:
再讲filestream类,这个是对数据流操作的,我们可以理解成是对字节进行操作的。该类中的方法是非静态方法,所以使用时需要实例化。该类中我们这里就主要介绍三个方法,依次是读操作,写操作以及同时的读写操作。
例如读操作程序:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FSteam
{
class Program
{
static void Main(string[] args)
{
READ1(@"D:\VS书籍学习\123.txt");
//这里用@符号是可以让程序知道我这个输入的地址格式可以被识别。
Console.Read();
}
public static void READ1(string str1)
{
if (!File.Exists(str1))
{
Console.WriteLine("输入的路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
FileStream fsread = new FileStream(str1,FileMode.Open,FileAccess.Read );
//FileStream类是非静态的,所以需要先进行实例化;
//定义所要操作的文件地址;filemode--对文件进行的操作,这里是open操作;
//fileaccess--对文件内部的数据进行的操作,这里是读操作;
byte[] buf = new byte[1024 * 1024 * 5];
//这里是1024B*1024=1KB*1024=1M.这里就是定义了一个5M的存储字节空间;
//由于是进行的数据读操作,所以要定义一个数组空间来对数据进行存储。
int x = fsread.Read(buf, 0, buf.Length);
//这里是进行数据的读操作,将数据以字节的形式存储在数组空间内
//由于我们刚开始定义的数组空间的大小并不是真正的文件数据大小。
//这里的x的值就是真正的数据大小。
string str = Encoding.Default.GetString(buf, 0, x);
//由于之前在数组中存取的数据是以字节形式存在的,为了显示出来
//这里用encoding来进行解码,将字节转换成字符串形式显示。
//可以发现这里buf用的是x,而不是buf.length,这里用的是真实值。
Console.WriteLine(str);
}
}
}
这就是对一个txt文件的读操作,我在电脑内部定义了一个txt文件:
他的地址是:
而下面这个是VS的运行结果:
以上就是一般的读取操作,下面的程序是写操作:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FSteam
{
class Program
{
static void Main(string[] args)
{
WRITE1(@"D:\VS书籍学习\123.txt");
//这里用@符号是可以让程序知道我这个输入的地址格式可以被识别。
Console.Read();
}
public static void READ1(string str1)
{
if (!File.Exists(str1))
{
Console.WriteLine("输入的路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
FileStream fsread = new FileStream(str1,FileMode.Open,FileAccess.Read );
//FileStream类是非静态的,所以需要先进行实例化;
//定义所要操作的文件地址;filemode--对文件进行的操作,这里是open操作;
//fileaccess--对文件内部的数据进行的操作,这里是读操作;
byte[] buf = new byte[1024 * 1024 * 5];
//这里是1024B*1024=1KB*1024=1M.这里就是定义了一个5M的存储字节空间;
//由于是进行的数据读操作,所以要定义一个数组空间来对数据进行存储。
int x = fsread.Read(buf, 0, buf.Length);
//这里是进行数据的读操作,将数据以字节的形式存储在数组空间内
//由于我们刚开始定义的数组空间的大小并不是真正的文件数据大小。
//这里的x的值就是真正的数据大小。
string str = Encoding.Default.GetString(buf, 0, x);
//由于之前在数组中存取的数据是以字节形式存在的,为了显示出来
//这里用encoding来进行解码,将字节转换成字符串形式显示。
//可以发现这里buf用的是x,而不是buf.length,这里用的是真实值。
Console.WriteLine(str);
}
public static void WRITE1(string str1)
{
if (!File.Exists(str1))
{
Console.WriteLine("输入的路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
using (FileStream fsread = new FileStream(str1, FileMode.Open, FileAccess.Write))
//定义一个写的实例里面包含地址,形式
{
string str = "我是真的爱你";
//这里是要输入的字符串
byte[] buf = Encoding.Default.GetBytes(str);
fsread.Write(buf, 0, buf.Length);
}
Console.WriteLine("输入完毕");
}
}
}
以上就是写操作的程序,这里我们看一下VS的输出显示框图:
这就是写入之后的数据内容:
可以发现写的字符串会自动覆盖原来的字符串所在位置。
下面就是最后一种就是将这两种结合起来,也就是读写操作,就是先将一个文件的数据读取出来,再写入另一个文件中。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FSteam
{
class Program
{
static void Main(string[] args)
{
string sourth= @"D:\VS书籍学习\123.txt";
string term = @"D:\VS书籍学习\456.txt";
//这里用@符号是可以让程序知道我这个输入的地址格式可以被识别。
DUXIE(sourth, term);
Console.Read();
}
public static void READ1(string str1)
{
if (!File.Exists(str1))
{
Console.WriteLine("输入的路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
FileStream fsread = new FileStream(str1, FileMode.Open, FileAccess.Read);
//FileStream类是非静态的,所以需要先进行实例化;
//定义所要操作的文件地址;filemode--对文件进行的操作,这里是open操作;
//fileaccess--对文件内部的数据进行的操作,这里是读操作;
byte[] buf = new byte[1024 * 1024 * 5];
//这里是1024B*1024=1KB*1024=1M.这里就是定义了一个5M的存储字节空间;
//由于是进行的数据读操作,所以要定义一个数组空间来对数据进行存储。
int x = fsread.Read(buf, 0, buf.Length);
//这里是进行数据的读操作,将数据以字节的形式存储在数组空间内
//由于我们刚开始定义的数组空间的大小并不是真正的文件数据大小。
//这里的x的值就是真正的数据大小。
string str = Encoding.Default.GetString(buf, 0, x);
//由于之前在数组中存取的数据是以字节形式存在的,为了显示出来
//这里用encoding来进行解码,将字节转换成字符串形式显示。
//可以发现这里buf用的是x,而不是buf.length,这里用的是真实值。
Console.WriteLine(str);
}
public static void WRITE1(string str1)
{
if (!File.Exists(str1))
{
Console.WriteLine("输入的路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
using (FileStream fsread = new FileStream(str1, FileMode.Open, FileAccess.Write))
//定义一个写的实例里面包含地址,形式
{
string str = "我是真的爱你";
//这里是要输入的字符串
byte[] buf = Encoding.Default.GetBytes(str);
fsread.Write(buf, 0, buf.Length);
}
Console.WriteLine("输入完毕");
}
public static void DUXIE(string str1,string str2)
{
if (!File.Exists(str1))
{
Console.WriteLine("输入的源头路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
if (!File.Exists(str2))
{
Console.WriteLine("输入的目标路径不正确");
//调用file.exists方法,如果路径不正确会有提示,而不会使系统出错
return;
}
using (FileStream fsread = new FileStream(str1, FileMode.Open, FileAccess.Read))
//所读取的文件位置
{
using (FileStream fswrite = new FileStream(str2, FileMode.Open, FileAccess.Write))
//目标位置
{
byte[] buf = new byte[1024];
//定义中间缓存的数组的大小,这里是1024B
while (true)
{
int x = fsread.Read(buf, 0, buf.Length);
//读取数据并存到数组中,得到真是数据长度x
if (x == 0)
{ break; }
//就是文件的最后没有数据是返回读到的为0,这是一行一行读写的
fswrite.Write(buf, 0, x);
}
Console.WriteLine("好了");
}
}
}
}
}