简单介绍:
四个类都是属于System.IO命名空间
名称 | 操作对象 | 使用方法 |
---|---|---|
File | 文件 | 静态类,直接调用静态方法处理文件 |
FileInfo | 文件 | 表示磁盘上的物理文件,具有处理此文件的方法 |
Directory | 目录 | 静态类,直接调用静态方法处理目录 |
DirectoryInfo | 目录 | 表示磁盘上的物理目录,具有处理此目录的方法 |
(一)File 和 FileInfo
1.区别及选择:
区别:
▶File类是全静态的,只有静态方法,不可实例化。
▶FileInfo类必须实例化使用,不包含静态方法。
选择:
▶一般如果只是单一方法调用,则可以选择File类,不需要实例对象再调用方法。
▶如果是需要对某一个文件进行多项操作,则选择FileInfo实例化对象会好一点,不需要使用File类每次查找文件进行安全检查。
2.File
(1).常用方法及作用介绍
方法 | 作用 |
---|---|
bool Exists(string path) | 确定指定的文件是否存在 |
void Delete(string path) | 删除指定的文件 |
DateTime GetCreationTime(string path) | 返回指定文件或目录的创建日期和时间 |
FileStream Create(string path) | 在指定路径中创建或覆盖文件 |
StreamWriter CreateText(string path) | 创建或打开用于写入 UTF-8 编码文本的文件 |
void Copy(string sourceFileName, string destFileName, bool overwrite) | 将现有文件复制到新文件。 允许覆盖同名的文件 |
FileStream Open(string path, FileMode mode, FileAccess access, FileShare share) | 打开指定路径上的 System.IO.FileStream,具有带读、写或读/写访问的指定模式和指定的共享选项 |
string[] ReadAllLines(string path, Encoding encoding) | 打开一个文件,使用指定的编码读取文件的所有行,然后关闭该文件 |
string ReadAllText(string path, Encoding encoding) | 打开一个文件,使用指定的编码读取文件的所有行,然后关闭该文件 |
void WriteAllLines(string path, string[] contents, Encoding encoding) | 创建一个新文件,在其中写入指定的字节数组,然后关闭该文件 |
void WriteAllText(string path, string contents, Encoding encoding) | 创建一个新文件,使用指定编码向其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则覆盖该文件 |
(2).部分方法测试使用:
测试前截图(文件夹里什么都没有):
贴上测试代码:
//要测试的文件路径
static string path = @"J:\Test\FileTest.txt";
static void Main(string[] args)
{
Test_By_File();
}
static void Test_By_File()
{
//先判断文件是否存在
Console.WriteLine("文件是否存在:" + File.Exists(path));
//按照路径创建一个文件
StreamWriter writer = File.CreateText(path);
writer.Close();//关闭文件
Console.WriteLine("现在文件是否存在呢:" + File.Exists(path));
//写入文件三句话
File.WriteAllText(path, "这是一个测试\n测试什么呢\n测试File静态类");
//按行读取文件
Console.WriteLine("-----读取文件:");
foreach (var line in File.ReadAllLines(path))
{
Console.WriteLine(line);
}
Console.ReadKey();
}
运行截图:
运行后文件截图:
3.FileInfo
(1).常用属性及方法介绍
属性或方法 | 作用 |
---|---|
DirectoryInfo Directory { get; } | 获取父目录的实例 |
string DirectoryName { get; } | 获取表示目录的完整路径的字符串 |
override string Name { get; } | 获取文件名 |
bool IsReadOnly { get; set; } | 获取或设置确定当前文件是否为只读的值 |
void MoveTo(string destFileName) | 将指定文件移到新位置,提供要指定新文件名的选项 |
FileInfo CopyTo(string destFileName, bool overwrite) | 将现有文件复制到新文件,overwrite 如果允许覆盖现有文件,则为 true;否则为 false |
override void Delete() | 永久删除文件 |
FileStream Open(FileMode mode, FileAccess access, FileShare share) | 用读、写或读/写访问权限和指定的共享选项在指定的模式中打开文件 |
StreamReader OpenText() | 创建使用从现有文本文件中读取的 UTF8 编码的 System.IO.StreamReader |
StreamWriter AppendText() | 创建一个 System.IO.StreamWriter,它向 System.IO.FileInfo 的此实例表示的文件追加文本 |
FileInfo Replace(string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors) | 使用当前 System.IO.FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。 还指定是否忽略合并错误 |
(2).部分方法测试使用
测试前截图(文件夹里什么都没有):
还是什么都没有,上一个测试文件已经删了,这里就不放图了
测试代码:
//要测试的文件路径
static string path = @"J:\Test\FileTest.txt";
static void Main(string[] args)
{
Test_By_FileInfo();
}
static void Test_By_FileInfo()
{
//创建测试路径文件夹
Directory.CreateDirectory(@"J:\Test");
//创建一个新文件
FileInfo info = new FileInfo(path);
info.CreateText().Close();
//文件是否存在
Console.WriteLine(" 文件是否存在 :" + info.Exists);
//获取父目录路径
Console.WriteLine("父目录的全路径:" + info.Directory.FullName);
//获取文件名
Console.WriteLine("文件名:" + info.Name);
//写入文件内容
StreamWriter write = info.AppendText();
write.WriteLine("这又是一个测试了\n测试什么呢?\n这次测试的是FileInfo");
write.Dispose();
write.Close();
//读取文件内容
FileStream read = info.OpenRead();
byte[] all = new byte[read.Length];
read.Read(all, 0, (int)read.Length);
string lines = Encoding.UTF8.GetString(all);
Console.WriteLine("内容是:");
Console.WriteLine(lines);
Console.ReadKey();
}
运行截图:
运行后文件截图:
(二)Directory和DirectoryInfo
1.区别及选择:
与上面File和FileInfo类似
区别:
▶Directory类是全静态的,只有静态方法,不可实例化。
▶DirectoryInfo类必须实例化使用,不包含静态方法。
选择:
▶一般如果只是单一方法调用,则可以选择Directory类,不需要实例对象再调用方法。
▶如果是需要对某一个文件夹进行多项操作,则选择DirectoryInfo实例化对象会好一点
2.Directory
(1).常用方法及作用介绍
方法 | 作用 |
---|---|
bool Exists(string path) | 确定给定目录是否存在 |
DateTime GetCreationTime(string path) | 获取目录的创建日期和时间 |
void Delete(string path, bool recursive) | 删除指定的目录,并删除该目录中的所有子目录和文件(如果recursive为true) |
string GetCurrentDirectory() | 获取应用程序的当前工作目录 |
DirectoryInfo GetParent(string path) | 检索指定路径的父目录,包括绝对路径和相对路径 |
string GetDirectoryRoot(string path) | 返回指定路径的卷信息、根信息或两者同时返回 |
DirectoryInfo CreateDirectory(string path) | 在指定路径中创建所有目录和子目录,除非它们已经存在 |
void Move(string sourceDirName, string destDirName) | 将文件或目录及其内容移到新位置 |
(2).部分方法测试使用
测试前截图:(J盘里什么都没有)
贴上测试代码:
static string path = @"J:\UnityTest\Folder";//测试路径
static void Main(string[] args)
{
Test_By_Directory();
}
static void Test_By_Directory()
{
Console.WriteLine("Directory 测试 :");
Console.WriteLine("-------------------------------------------");
if (!Directory.Exists(path))//判断该路径文件夹是否存在
{
//如果不存在,则在J盘下新建一个名字叫Folder的文件夹
Directory.CreateDirectory(path);
}
//获取创建时间 DateTime型,通过Directory静态函数
Console.WriteLine("创建时间: " + Directory.GetCreationTime(path));
//获取上次访问当前文件或目录的时间 DateTime型,通过Directory静态函数
Console.WriteLine("上次访问时间: " + Directory.GetLastAccessTime(path));
//获取父文件夹的信息 DirectoryInfo型,这里打印父文件夹的名字
Console.WriteLine("父文件夹名字: " + Directory.GetParent(path).Name);
//获取应用程序的当前工作目录
Console.WriteLine("父文件夹名字: " + Directory.GetCurrentDirectory());
//删除文件夹
//Directory.Delete(path);//如果目录里不为空,会抛出异常
Directory.Delete(path, true);//参数true表示目录里有文件也一并删除
Console.ReadKey();
}
运行截图:
运行后目录截图:
只有父文件夹UnityTest了,目标文件夹Folder已经被删除了
3.DirectoryInfo
(1).常用属性及方法介绍
属性或方法 | 作用 |
---|---|
DirectoryInfo Parent { get; } | 获取指定的子目录的父目录 |
override bool Exists { get; } | 获取指示目录是否存在的值 |
DirectoryInfo Root { get; } | 获取目录的根部分 |
void Create() | 创建目录 |
void Delete(bool recursive) | 删除此实例,指定是否删除子目录和文件 |
FileInfo[] GetFiles(string searchPattern, SearchOption searchOption) | 返回当前目录的文件列表,该列表与给定的搜索模式匹配并且使用某个值确定是否搜索子目录 |
DirectoryInfo[] GetDirectories(string searchPattern, SearchOption searchOption) | 返回当前 DirectoryInfo 中目录的数组,该数组与给定的搜索条件匹配并使用某个值确定是否搜索子目录 |
其中GetFiles方法和GetDirectories方法都包含几个参数用来筛选选项
* eg:
* public DirectoryInfo[] GetDirectories();
* public DirectoryInfo[] GetDirectories(string searchPattern);
* public DirectoryInfo[] GetDirectories(string searchPattern, SearchOption searchOption);
–>第一个参数 searchPattern:要与目录名匹配的搜索字符串。 此参数可包含有效路径和通配符(* 和 ?) 字符,但不支持正则表达式。 默认模式为“*”,该模式返回所有文件。
–>第二个参数 searchOption :指定搜索操作是应仅包含当前目录还是应包含所有子目录的枚举值之一。
其中SearchOption是一个枚举,用来指定是否搜索当前目录中,或当前目录和所有子目录。
public enum SearchOption
{
TopDirectoryOnly = 0,//在搜索操作中包括仅当前目录。
AllDirectories = 1//在搜索操作中包括当前目录及其所有的子目录。 此选项在搜索中包括如装入的驱动器和符号链接的重新分析点。
}
(2).部分方法测试使用
测试前截图:(J盘里还是什么都没有,都删了)
贴代码:
static string path = @"J:\UnityTest\Folder";//测试路径
static DirectoryInfo folderInfo;
static void Main(string[] args)
{
Test_By_DirectoryInfo();
}
static void Test_By_DirectoryInfo()
{
Console.WriteLine("DirectoryInfo 测试 :");
Console.WriteLine("-------------------------------------------");
folderInfo = new DirectoryInfo(path);
if (!folderInfo.Exists) //判断该路径文件夹是否存在
{
//如果不存在,则在J盘下新建一个名字叫Folder的文件夹
folderInfo.Create();
//在目标目录下新建一个Home文件夹测试
Directory.CreateDirectory(path + @"\Home");
//在目标目录下新建一个People.txt文件测试
File.CreateText(path + @"\People.txt");
}
//获取文件夹名字
Console.WriteLine("名字 :" + folderInfo.Name);
//获取文件夹全路径名称
Console.WriteLine("全路径名字 :" + folderInfo.FullName);
Console.WriteLine("-------------------------------------------");
//获取父文件夹的信息 DirectoryInfo型,这里打印父文件夹的名字
Console.WriteLine("父文件夹名字: " + folderInfo.Parent.Name);
//获取目录中所有的文件 FileInfo[]型
FileInfo[] files = folderInfo.GetFiles();
Console.WriteLine("包含的文件名字: ");
foreach (var it in files)
{
Console.WriteLine("-- 名字: " + it.Name + " " + it.FullName);
}
//获取目录中文件夹信息 DirectoryInfo[]型
DirectoryInfo[] folder = folderInfo.GetDirectories();
Console.WriteLine("-------------------------------------------");
Console.WriteLine("包含的文件夹名字: ");
foreach (var file in folder)
{
Console.WriteLine("-- 名字: " + file.Name + " " + file.FullName);
}
//删除文件夹
//folderInfo.Delete();//如果目录里不为空,会抛出异常
//folderInfo.Delete(true);//参数true表示目录里有文件也一并删除
Console.ReadKey();
}
运行截图:
运行后目录截图:
有文件,有文件夹。
(三)扩展FileStream、StreamWriter 、StreamReader
1.FileStream
FileStream 类用来表示文件读写流,主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件。
在创建 FileStream 类的实例时还会涉及多个枚举类型的值, 包括 FileAccess、FileMode、FileShare、FileOptions 等。
//摘要:对于读、 写或读/写访问的文件中定义的常数。
public enum FileAccess
{
Read = 1,//对文件的读取访问权限。 可以从文件读取数据。 将与结合起来 Write 为读/写访问。
Write = 2,//对文件的写入访问权限。 数据可以写入该文件。 将与结合起来 Read 为读/写访问。
ReadWrite = 3//读取和写入到文件的访问。 可以写入和从文件中读取数据。
}
//摘要:打开文件的方式。
public enum FileMode
{
CreateNew = 1,//指定操作系统应创建一个新的文件。 如果该文件已存在, 则会引发异常。
Create = 2,//指定操作系统应创建一个新的文件。 如果该文件已存在,则会覆盖它。FileMode.Create 等效于请求,如果该文件不存在,则使用 FileMode.CreateNew。如果该文件已存在但为隐藏的文件, 则会引发异常。
Open = 3,//指定操作系统应打开现有文件。如果文件不存在将引发异常。
OpenOrCreate = 4,//打开已经存在的文件,如果文件不存在,则创建文件。
Truncate = 5,//打开已经存在的文件,并清除文件中的内容
Append = 6//如果它存在,并且查找到该文件的末尾,或者创建一个新文件,请打开该文件。
}
//摘要:主要用于设置多个对象同时访问同一个文件时的访问控制。
public enum FileShare
{
None = 0,//拒绝共享当前文件。
Read = 1,//允许以后打开文件进行读取。
Write = 2,//允许以后打开文件进行写入。
ReadWrite = 3,//允许以后打开的文件进行读取或写入。
Delete = 4,//允许以后删除文件。
Inheritable = 16//使文件句柄由子进程继承。
}
// 摘要:用于设置文件的高级选项,包括文件是否加密、访问后是否删除等
public enum FileOptions
{
WriteThrough = int.MinValue,//指示系统应编写通过任何中间缓存并直接转到磁盘。
None = 0,//指示在创建时,应使用任何其他选项 System.IO.FileStream 对象。
Encrypted = 16384,//指示文件已加密,可以解密只能通过使用加密所用的相同用户帐户。
DeleteOnClose = 67108864,//指示不再使用时自动删除某个文件。
SequentialScan = 134217728,//指示该文件将从开头到末尾顺序访问。 系统可以以此作为一个提示,以优化文件缓存。 如果应用程序移动随机访问的文件指针最佳缓存可能不会发生;但是,仍然保证正确操作。
RandomAccess = 268435456,//指示随机访问该文件。 系统可以以此作为一个提示,以优化文件缓存。
Asynchronous = 1073741824//表示可以使用异步读取和写入的文件。
}
常用属性或方法:
属性或方法 | 作用 |
---|---|
override long Length { get; } | 获取用字节表示的流长度 |
override bool CanRead { get; } | 获取一个值,该值指示当前流是否支持读取 |
override bool CanWrite { get; } | 获取一个值,该值指示当前流是否支持写入 |
override void Write(byte[] array, int offset, int count) | 将字节块写入文件流 |
override int Read(byte[] array, int offset, int count) | 从流中读取字节块并将该数据写入给定缓冲区中 |
2.StreamWriter
StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。
常用属性或方法:
属性或方法 | 作用 |
---|---|
override Encoding Encoding { get; } | 获取当前流的 Encoding |
override void Close(); | 关闭当前 StreamWriter 对象和基础流 |
override void Write(string value) | 将字符串写入流 |
override Task WriteAsync(string value) | 将字符串异步写入该流 |
3.StreamReader
StreamReader 类用于从流中读取字符串。它继承自 TextReader 类
常用属性或方法:
属性或方法 | 作用 |
---|---|
virtual Encoding CurrentEncoding { get; } | 获取当前 StreamReader 对象正在使用的当前字符编码 |
override void Close(); | 关闭当前 StreamReader对象和基础流 |
override string ReadToEnd() | 读取来自流的当前位置到结尾的所有字符 |
override string ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回 |
部分方法属性测试在上面文件操作的例子里都有使用,这算是记录一次测试过程。