path类
绝对路径,绝对路径是在你的个人电脑上一定能找到其文件的路径,但是只限于个人电脑。相对路径没有绝对路径明确,但是却可以在任意一台电脑上找寻文件。
绝对路径:绝对路径是指文件在磁盘上的的完整路径,例如 b.cs 程序调用 a.txt 时,填写“D:\itcast\a\b\a.txt”,在程序中使用绝对路径时需要注意该路径的位置,当该位置发生改变时可能会导致异常。
相对路径:相对路径是指当前文件相对于其他文件(或文件夹)之间的路径关系。例如在路径D:\itcast\a\b\下有程序文件“b.cs”和文本文件“a.txt”这两个
文件,那么相对于“b.cs”文件来说,“a.txt”文件就是在同一文件目录下,所以在“b.cs”文件中调用“a.txt”文件直接写文件名便可。相对路径使用符号“/”表示,具体使用方式如下。
● 在斜杠前面加一个点(./)表示上一级目录;
● 在斜杠前面加两个点(../)表示当前文件的根目录。
string path1 = @"D:\FileTest\Test.txt";
拼接成一个完整的路径
string path2 = Path.Combine(@"D:\FileTest", @"Test.txt");
*******************************
string path3 = @"D:\FileTest\Test\xxx\01\12.txt";
得到12.txt所在的文件夹的路径
Console.WriteLine(Path.GetDirectoryName(path3));
得到文件的扩展名
Console.WriteLine(Path.GetExtension(path3));
得到文件名 包含扩展名
Console.WriteLine(Path.GetFileName(path3));
得到文件名 但是不包含扩展名
Console.WriteLine(Path.GetFileNameWithoutExtension(path3));
得到当前文件所在的绝对路径
Console.WriteLine(Path.GetFullPath("12.txt"));
******************************
string path4 = Path.GetFullPath("12.txt");
获得当前文件的根目录信息
Console.WriteLine(Path.GetPathRoot(path4));
返回随机文件夹或文件名
Console.WriteLine(Path.GetRandomFileName());
流和文件流
大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等,在 C#中将这种通过不同输入/输出设备(键盘、内存、显示器、网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入/输出设备进行数据传输。C#中的“流”都位于System.IO命名空间中,称为IO(输入/输出)流。
在计算机中,无论是文本、图片、音频还是视频,所有的文件都是以二进制(字节)形式存储的。为此,C#专门针对文件的输入/输出操作提供了一系列的流,统称为文件流。文件流是程序中最常用的流,根据数据的传输方向可将其分为输入流和输出流。
*********************************************************
路径中“@”符号表示不解析转义字符,如果没有“@”前缀就需要用“\\”替代“\”。通过前面的学习可知,“\”是一个转义字符,在程序中要表示一个“\”就需要使用“\\”。例如下面这句代码。
FileInfo aFile = new FileInfo("C:\\Data.txt");
********************************************************
流可以对文件的内容进行读写操作,而在应用程序中还可能会对文件自身进行一些操作,例如创建、删除或者重命名某个文件,判断磁盘上某个文件是否存在等。针对这些操作,C#中提供了File类和FileInfo类这两个类
***********程序集***********
Assembly表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块。
LoadFile加载指定路径上的程序集文件的内容。
Assembly assem = Assembly.LoadFile(path);
File类
File 类是一个静态类,它提供了许多静态方法,用于处理文件,使用这些方法可以对文件进行创建、移动、查询和删除等操作
string path = @"D:\FileTest\1707A\aa.txt";
string destPath = @"D:\FileTest\1707A\aa.txt";
Test01(path);创建出来的文件为绝对路径
Test01("王垚.txt");创建出来的路径为相对路径
File.Exists(path)用来确定指定的文件是否存在
if (File.Exists(path))
{
Console.WriteLine("文件已经存在");
}
else
{
如果不存在则创建文件(File.Create(path)用来创建文件)
File.Create(path);
}
File.Move(sourcePath, destPath);将指定文件移到新位置,并提供新文件名;
File.Delete(path);删除指定的文件
从文件读取数据的流
FileStream fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Read);
byte[] byteArr = new byte[4096];
int len = 0;
string destPath = @"D:\FileTest\1707A\Newaa.txt";
写入文件的流
FileStream fsWrite = File.Open(destPath, FileMode.OpenOrCreate, FileAccess.Write);
len表示 在调用Read方法的时候 从文件中实际读取的字节数
while ((len = fs.Read(byteArr, 0, byteArr.Length)) != 0)
{
fsWrite.Write(byteArr, 0, len);
}
FileInfo类
FileInfo类与File类有些类似,它们都可以对磁盘上的文件进行操作。不同的是FileInfo类是实例类,所有的方法都只能在实例化对象后才能调用。创建 FileInfo 类对象时必须传递一个文件路径作为参数
string path = @"D:\FileTest\1707A\aa.txt";
string destPath = @"D:\FileTest\1707A\bb.txt";
Test01(path,destPath);
FileInfo fi = new FileInfo(path);
获取当前文件所在的目录
Console.WriteLine(fi.Directory);
获取当前文件所在的目录
Console.WriteLine(fi.DirectoryName);
判断文件是否是只读的
Console.WriteLine(fi.IsReadOnly);
获取文件的大小 单位是字节
Console.WriteLine(fi.Length);
类似拷贝 复制操作 如果目标目录下面有相同的文件 则会抛出异常
fi.CopyTo(destPath);
类似剪切操作,将指定文件移到新位置,并提供指定新文件名
fi.MoveTo(@"D:\FileTest\1707A\YY\bb.txt");
StreamWriter sw = fi.AppendText();追加文本效果,能使每次控制台启动添加文本。
sw.Write("abcdefg");将字符串写入流
清理所有缓冲区,强制刷出缓冲区中的数据,写入基础流
sw.Flush();
关闭流,就是一个保险装置。
sw.Close();
Directory类和DirectoryInfo类
在程序开发中,不仅需要对文件进行操作,而且还需要对文件目录进行操作。例如创建目录,删除目录等,为此C#提供了Directory类和DirectoryInfo类。
******************************
Directory类是静态类,提供了许多静态方法用于对目录进行操作,例如创建、删除、查询和移动目录等。
静态方法,在指定目录创建所有目录和子目录
Directory.CreateDirectory(path);
******************************
DirectoryInfo类的功能与Directory类相似,不同的是DirectoryInfo是一个实例类,该类不仅拥有与Directory类功能相似的方法,而且还具有一些特有的属性。
实例方法,检索指定的父目录
DirectoryInfo di = Directory.GetParent(path);
FileStream 类
FileStream 类表示在磁盘或网络路径上指向文件的流,并提供了在文件中读写字节和字节数组的方法,通过这些方法,FileStream 对象可以读取诸如图像、声音、视频、文本文件等,也就是说FileStream类能够处理各种数据文件。
FileStream类有很多重载的构造方法,其中最常用的是带有三个参数的构造方法,具体如下。
FileStream(string path, FileMode mode, FileAccess access);
上述构造方法中,第一个参数path表示的是文件路径名,第二个参数mode表示如何打开或创建文件,第三个参数access用于确定 FileStream 对象访问文件的方式。
创建一个是否有此文件(没有则创建有则打开),并从中读取数据的实例文件流。
fsRead=new FileStream(sourcePath,FileMode.OpenOrCreate, FileAccess.Read);
创建一个是否有此文件(没有则创建有则打开)并向其中写入数据的实例文件流。
fsWrite = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write);
搭配使用使第一个文件的数据以字节为单位全部写入第二个文件
int temp = -1;
while ((temp = fsRead.ReadByte()) != -1)
{
fsWrite.WriteByte((byte)temp)
}
数据流通常与try-catch-catch-finally搭配寻找异常的实例
FileStream fsRead = null;
FileStream fsWrite = null;
try
{
fsRead = new FileStream(sourcePath, FileMode.OpenOrCreate, FileAccess.Read);
fsWrite = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write);
int temp = -1;
while ((temp = fsRead.ReadByte()) != -1)
{
fsWrite.WriteByte((byte)temp);
}
}
catch(IOException e)(IO异常)
{
Console.WriteLine(e.Message);
}
catch(Exception e)(其他异常)
{
Console.WriteLine(e.Message);
}
finally
{
fsRead.Close();
fsWrite.Close();
}
StreamReader类和StreamWriter类
FileStream 类只能通过字节或字节数组的方式对文件进行操作,当处理文本文件时还需要在字节与字符数据之间进行转换,这时程序会显得过于繁琐。为此,C#专门提供了StreamReader类和StreamWriter类用于处理文本文件。
创建一个是否有此文件(没有则创建有则打开),并从中读取数据的实例文件流。
FileStream fsReader = new FileStream(path1,FileMode.OpenOrCreate,FileAccess.Read);
实现一个实例,使其以特定的字符编码从字节流中读取字符(Encoding表示一种字符编码)
StreamReader sr = new StreamReader(fsReader,Encoding.Default);
创建一个是否有此文件(没有则创建有则打开)并向其中写入数据的实例文件流。
FileStream fsWriter = new FileStream(path2,FileMode.OpenOrCreate,FileAccess.Write);
StreamWriter sw = new StreamWriter(fsWriter,Encoding.Unicode);
BufferedStream类
在前面的学习中都是将文件存储到硬盘,但有时希望将文件临时存储到缓冲区中,方便以后读取。为此C#中提供了BufferedStream类。BufferedStream类必须和其他流一起使用,并将这些流写入内存中,这样可以提高读取和写入速度。
将读取的文件写入缓冲区。
FileStream fsRead = new FileStream(path,FileMode.OpenOrCreate,FileAccess.Read);
BufferedStream bsRead = new BufferedStream(fsRead);
将写入的文件写入缓冲区。
FileStream fsWrite = new FileStream(path1,FileMode.OpenOrCreate,FileAccess.Write);
BufferedStream bsWrite = new BufferedStream(fsWrite);