C#文件操作
删除文件:Systme.IO.File.Delete("d:\\test.txt");在删除文件之前,也可用File.Exists("d:\\test.txt")方法检查文件是否存在,返回false文件不存在。
复制文件: File.Copy("d:\\test.txt", "e:\\abc.txt", true); 意思是把D盘的test.txt复制到e盘下,并改名为abc.txt。
后面那个参数指当有同名的文件情况下,是否覆盖掉同名的文件。true为覆盖掉。
移动文件:File.Move("d:\\test.txt", "e:\\abc.txt");这句,如果e盘下已经存在一个abc.txt文件了,就会产生异常。
创建文件:File.Create("d:\\ddd.bbb");
追加打开一个文件:File.AppendText,从文件的末尾读写。
打开文件:File.Open("d:\\eee.txt", FileMode.Open);这个函数返回文件流FileStream,可进行读写。另:如果第二个参数为
FileMode.CreateNew则表明创建文件,如果文件已存在,则引发异常。FileMode.Create表明文件存在,依旧创建覆盖掉原有的文件。
当然文件的创建,删除等并不一定非得通过File类,还有一些其它跟文件操作相类的也可以做到。
用StreamReader类来读入一行文本:
class Programt
{
static void Main(String[] args)
{
//用StreamWriter类来创建一个文件,并写入数据
StreamWriter strWriter = new StreamWriter("d:\\1233.txt");
strWriter.WriteLine("333333333");
strWriter.WriteLine("4444444");
//关闭流
strWriter.Close();
//打开1233.txt
StreamReader strReader = new StreamReader("d:\\1233.txt");
//循环读取一行文本,返回null则文件读取到头。
String textLine;
while ((textLine = strReader.ReadLine()) != null)
{
//输出一行文本内容
Console.WriteLine(textLine);
}
}
}
另外还有FileStream类,这个类在说异常的时候用到过,现在我直接把那个例子修改一下,贴在下面。
它构造函数的参数解释可以参考File.Open的参数。
class Programt
{
static void Main(String[] args)
{
try
{
FileStream fileStream = new FileStream("d:\\test.txt", FileMode.Open);
//读取所有数据
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer, 0, (int)fileStream.Length);
//转换成字符串
String str = Encoding.Default.GetString(buffer);
Console.WriteLine(str);
}
catch (FileNotFoundException e)
{
Console.WriteLine("文件不存在!");
}
}
}
像之前写入(读取)的数据都是以字符串的形式(Unicode编码的字符串转换成字节),这次我们直接写入
其它数据类型的。二进制读写文件。用BinaryWriter,看下例:
class Programt
{
static void Main(String[] args)
{
//创建文件
FileStream stream = File.Open("d:\\binary.txt", FileMode.Create);
BinaryWriter bryWriter = new BinaryWriter(stream);
for (int i = 0; i < 5; i++)
bryWriter.Write(i);//整形i占4个字节
//关闭流
bryWriter.Close();
stream.Close();
//再读取出来
FileStream strReader = File.Open("d:\\binary.txt", FileMode.Open);
BinaryReader bryReader = new BinaryReader(strReader);
for (int i = 0; i < 5; i++)
Console.WriteLine(bryReader.ReadInt32());//每次读取4个字节,读取的是int32
}
}
也可以用bryWriter.Write写入其它数据类型,如字符:bryWriter.Write('c');当然字符占两个字节。
也可以读写字节byte数组。这里不做说明了,另外,字符串与字节数组的转换可以参考网络编程那里。
上面我写入5个整型类型,共占20个字节,那么如果用文本编辑器(字符串形式)打开那个文件的话。
可以看到20个乱码字符。这些数据可以一一对应起来。比如占4字节的整型数值1,它的二进制值就是:
00000000 00000000 00000000 00000001 那么文件里第1,2,3,4个字符的ASCII码的二进制值就是
前面4个。
另外FileStream.Seek指定位流的位置,可以指定位置从哪里开始读取流中的数据。
文件属性
File.GetAttributes可以获取文件的属性,这个函数的返回值是一个FileAttributes枚举类型。可以通过按位与,按位或的运算来判断。
设置也是一样File.SetAttributes。
比如判断一个文件是否具有隐藏属性:
if ((File.GetAttributes("d:\\test.txt") & FileAttributes.Hidden) == FileAttributes.Hidden)
{
Console.WriteLine("文件具有隐藏属性");
}
或者把一个文件设置为隐藏:
File.SetAttributes("d:\\test.txt",File.GetAttributes("d:\\test.txt") | FileAttributes.Hidden);
按位与,按位或的运算原理可以参考如流,新一代智能工作平台
第十七个SetFileAttributes设置文件属性函数
文件夹(目录)的操作
创建一个文件夹:Directory.CreateDirectory("d:\\test");
复制目录:Directory.Move("d:\\test", "c:\\test");
删除目录:Directory.Delete("d:\\test", true);
遍历一个文件夹下的所有文件
先用DirectoryInfo类获取这个文件夹的信息。
如:DirectoryInfo dirInfo=new DirectoryInof("d:\\test");
再用GetFiles函数获取这个文件夹下所有文件的信息。
如FileInfo filesInfo=dirInfo.GetFiles();也可以使用通配符获取指定的文件,如只获取EXE文件的就是dirInfo.GetFiles("*.exe");
另外GetDirectories可以获取目录下的所有子目录。
看示例:
class Programt
{
static void Main(String[] args)
{
DirectoryInfo dirInfo = new DirectoryInfo("d:\\test");
Console.WriteLine("test目录下的文件:");
FileInfo[] filesInfo = dirInfo.GetFiles();
foreach (FileInfo fileInfo in filesInfo)
{
//输出文件名
Console.WriteLine(fileInfo.Name);
}
Console.WriteLine("test目录下的子目录:");
DirectoryInfo []dirs = dirInfo.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
//输出子目录名
Console.WriteLine(dir.Name);
}
}
}
如果要遍历子目录下的文件,可以定义一个递归函数,用递归函数来完成。
用DriveIfno类获取计算机各驱动器的信息。
枚举所有盘符:
class Programt
{
static void Main(String[] args)
{
DriveInfo[] dis = DriveInfo.GetDrives();
foreach (DriveInfo di in dis)
{
Console.WriteLine(di.Name);
}
}
}
另外DriveInfo类里的AvailableFreeSpace和TotalSize记录着盘符的可用空间,和总大小。