对于文件和文件夹的操作,fileinfo和directoryinfo是对文件和文件夹进行一些属性类的操作,比如文件的创造,移动,删除,重建,是不能对文件里面具体的内容进行操作的。想要对于文件内部的一些读写修改操作,则是要用到后面的file类和stream数据流类。这里要说明的是file类对文件操作是对全体文件内容的操作,如果文件太大,则用file类处理会很慢,这时用stream数据流类就比较适合读文件较大的文件,因为这是一点点读取文件的,一部分一部分的读取,会提高效率。
首先介绍fileinfo(文件)和directoryinfo(文件夹)类来读取文件和文件夹属性,在这两个类中主要是用来查看文件的基本属性,创建或者移动文件,判断路径是否存在等,这两个类都是在 System.IO类下的,使用他们之前需要先using一下。
这里首先先介绍的是filoinfo类的几种常规操作,主要是包括查看文件的路径,复制,移动,删除等。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace filestudy
{
class Program
{
static void Main(string[] args)
{
FileInfo fileIN = new FileInfo("TextFile1.txt");
//这里是创建一个相对路径;
// 这里主要是由于textfile1和当前类是在同一目录下的;
//该目录指的是文件的编译路径在bin--debug下;
//可以右击项目属性--生成中看到输出路径;
//这里由于我们添加的是相对路径,则需要把该文件放在debug下面;
Console.WriteLine(fileIN.Exists);
//查看文件是否存在,返回时bool值;
FileInfo fileIN1 = new FileInfo(@"D:\VS书籍学习\文件与数据流的具体操作\文件与数据流系统学习\filestudy\bin\Debug\TextFile1.txt");
//这里是绝对路径,就是直接输入该文件在电脑中的位置;
//输入位置时,需要在前面加@符号,这样就可以使这些路径符号符合定义;
Console.WriteLine(fileIN1.Exists);
Console.WriteLine(fileIN1.Directory);
//查看该文件的路径,这个是不显示该文件的名称,只显示其上级名称;
Console.WriteLine(fileIN1.FullName);
//查看文件的全部路径,包括本文件名称也显示;
Console.WriteLine(fileIN1.Length);
//获取该文件的大小,以字节显示出来;
Console.WriteLine(fileIN1.IsReadOnly);
//文件是否是只读选项,这里可以右击文件属性查看;
///下面看看fileinfo的方法都有哪些
fileIN1.MoveTo("text7.txt");
//将原来的文件改名变成现在的文件
FileInfo file1 = new FileInfo("test.txt");
if (file1.Exists==false)
{
//如果不存在就创建;
file1.Create();
}
Console.Read();
}
}
}
显示结果是这样:
以上就是fileinfo类对于文件的操作,下面是directoryinfo类主要是对文件夹进行操作,主要包括文件夹的创建、移动等:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace filestudy
{
class Program
{
static void Main(string[] args)
{
DirectoryInfo dirinfo = new DirectoryInfo(@"D:\VS书籍学习\文件与数据流的具体操作");
//同样这里的directoryinfo类的输入可以是绝对路径也可以是相对路径;
DirectoryInfo dirinfo1 = new DirectoryInfo("GOOD");
//同样这里输入的相对路径,相对路径就是在系统默认运行的输出路径,这里是Bin-debug文件夹下面;
Console.WriteLine(dirinfo.Exists);
//输出是bool类型,看该文件夹石是否存在;
Console.WriteLine(dirinfo.Parent);
//获取其父目录;
if (!dirinfo1.Exists)
//如果该文件夹不存在,则新建一个该文件夹
{
dirinfo1.Create();
}
dirinfo.CreateSubdirectory("这是子目录");
//在文件夹中再创建一个子目录;
}
}
}
总结一下上面两个fileinfo和directoryinfo类就是一般的对文件和文件夹的操作,包括读取信息啊,进行文件夹的复制和删除,创建等。这两个类都是非静态类在使用时,需要进行实例化。
上面两个类进行的都是一些表面的属性,识别名称,复制,创建这些,并不能有效的对文件的具体内容进行操作,下面要介绍的就是对文件的具体所包含的内容操作。
下面首先要介绍的就是file类:
首先介绍的是file类的读操作
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace file类的操作
{
class Program
{
static void Main(string[] args)
{
string str= File.ReadAllText("测试.txt");
//输入一个相对路径,返回的是一个字符串型,是一行一行的读取输出;
Console.Write(str);
byte[] str1 = File.ReadAllBytes("测试.txt");
//这是读取文件的内容,返回的是字节形式的数组;
foreach (var x in str1)
//遍历方式读取数组中的内容;
{
Console.Write(x);
}
byte[] str2 = File.ReadAllBytes("123.png");
//读取一个图片,结果以字节的形式返回在一个数组内;
foreach (var item in str2)
{
Console.Write(item);
}
Console.Read();
}
}
}
可以发现在进行file类的读操作时,都会有一个返回值,这个可以时字符串也可以是数组,就是要把数据拿出来放在一个里面空间里面。
下面是用file类对文件进行写入操作:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace file类的操作
{
class Program
{
static void Main(string[] args)
{
File.WriteAllText("写入的文件.txt", "这个是写入的内容");
//在默认输出路径下,创建一个txt文件,并且在其中写入以上内容;
File.WriteAllLines("新的文件", new string[] { "qwe", "wer" });
//在默认输出路径下创建一个新的txt文件,并且在其中写入数组元素;
byte[] arr = File.ReadAllBytes("123.png");
//首先将图片的字节存储在字节数组中;
File.WriteAllBytes("这是图片.png", arr);
Console.WriteLine("OK");
Console.Read();
}
}
}
这是显示结果:
可以发现在进行写操作时,直接是对相关的路径文件进行操作,就不用再定义一个空间等的用来存储。
上面介绍的是file类的对文件内部数据的一些操作,这些操作可是是字符串,也可以是数组型的,而下面要讲的就是filestream类,这个类操作的是字节类型的数组文件,一般file类的操作对象是文本文件,而filestream类的操作是非文本文件用的比较多。
这里filestream的读操作:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 数据流操作
{
class Program
{
static void Main(string[] args)
{
FileStream fsread = new FileStream("TextFile1.txt", FileMode.Open);
//实例化数据流,对文件的操作是打开;
byte[] arr = new byte[1024];
//定义一个1024字节的数组,用于数据存储;\
while (true)
{
int len = fsread.Read(arr, 0, arr.Length);
//从流中读取数据块并把它放在定义好的数组中,返回的该文件的真实长度;
//读入缓冲区中的总字节数。如果当前的字节数没有所请求那么多,则总字节数可能小于所请求的字节数;或者如果已到达流的末尾,则为零
if (len==0)
{
Console.WriteLine("OK");
break;
}
for (int i = 0; i < len; i++)
{
Console.Write(arr[i] + " ");
}
Console.Read();
}
}
}
}
下面是对filestream的读写操作,就是把数据从一个文件写另一个数据文件中:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 数据流操作
{
class Program
{
static void Main(string[] args)
{
FileStream fsread = new FileStream("123.png",FileMode.Open);
//实例化一个读操作,目标文件是该默认输出文件的图片;
FileStream fswrite = new FileStream("234.png", FileMode.Create);
//实例化一个写操作,这里是创建一个文件,用来写入数据;
byte[] arr = new byte[1024*1024*2];
//定义一个2M的字节存储空间;
while (true)
{
int len = fsread.Read(arr, 0, arr.Length);
//实际的文件大小;
if (len==0)
{
Console.WriteLine("OK");
break;
}
fswrite.Write(arr, 0, len);
//将数组中的数据写入目标位置;
}
fsread.Close();
fswrite.Close();
//关闭数据流;
}
}
}
以上就是filestream的一般操作,由于他比较适合读取一些二进制的文件,放在字节数组中,方便操作,但是我们不知道文本里面是含的什么信息,因为读取出的是字节数据,所以又有了下面的两个类streamwriter和streamreader:
首先介绍的时streamreader,这是对文件内部数据的读操作:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace streamreader
{
class Program
{
static void Main(string[] args)
{
StreamReader sread = new StreamReader("TextFile1.txt");
//创建一个实例对象,所要读取的文件时TEXE文件;
while (true)
{
string str = sread.ReadLine();
//该方法返回的时一行,就是执行一次返回一行;
if (str == null)
{//如果读取到文件的最后,则是null
Console.WriteLine("ok");
break;
}
Console.WriteLine(str);
}
sread.Close();
Console.ReadLine();
}
}
}
下面介绍的是streamweiter类,就是写入数据流:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace streamreader
{
class Program
{
static void Main(string[] args)
{
/* StreamReader sread = new StreamReader("TextFile1.txt");
//创建一个实例对象,所要读取的文件时TEXE文件;
while (true)
{
string str = sread.ReadLine();
//该方法返回的时一行,就是执行一次返回一行;
if (str == null)
{//如果读取到文件的最后,则是null
Console.WriteLine("ok");
break;
}
Console.WriteLine(str);
}
sread.Close();
Console.ReadLine();*/
StreamWriter swrit = new StreamWriter("TEXT2.txt");
//创建一个写数据流,写的数据流写入的时默认路径下面的文件;
while (true)
{
string str = Console.ReadLine();
//用户输入需要写的数据;
if (str == "w")
{ break; }
swrit.Write(str);
}
swrit.Close();
}
}
}
总结一下,对于文件和文件夹的操作,fileinfo和directoryinfo是对文件和文件夹进行一些属性类的操作,比如文件的创造,移动,删除,重建,是不能对文件里面具体的内容进行操作的。想要对于文件内部的一些读写修改操作,则是要用到后面的file类和stream数据流类。这里要说明的是file类对文件操作是对全体文件内容的操作,如果文件太大,则用file类处理会很慢,这时用stream数据流类就比较适合读文件较大的文件,因为这是一点点读取文件的,一部分一部分的读取,会提高效率。