前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈.Net Framework中实现的文件操作(一)

浅谈.Net Framework中实现的文件操作(一)

作者头像
小蜜蜂
发布2019-07-17 15:14:06
5610
发布2019-07-17 15:14:06
举报
文章被收录于专栏:明丰随笔

在.Net Framework中已经实现了操作文件的类,请看它们的类图:

本文主要讨论FileInfoDirectoryInfoFileSystemInfo三个类。

FileInfo和DirectoryInfo继承于FileSystemInfo类。

FileSystemInfo类是抽象类,它代表了一个具体的文件对象或者一个具体的目录对象。

它的属性:

代码语言:javascript
复制
//获取文件的特性信息
FileAttributes Attributes;
DateTime CreationTime;
DateTime LastAccessTime;
DateTime LastWriteTime;
//表明文件或者路径是否存在
bool Exists;
//获取表示文件扩展名部分的字符串。目录对象返回空字符串。
string Extension;
//获取文件或者目录的完整路径
string FullName;
//如果是文件对象,获取文件名(包含后缀名)。
//如果是目录对象,并且存在层次结构,则获取层次结构中最后一个目录的名称。
string Name;

它的方法:

代码语言:javascript
复制
//删除文件或者目录
void Delete();
//可以设置info对象的额外信息
void GetObjectData(SerializationInfo info, StreamingContext context);
//根据文件或者目录最新状态刷新对象的状态。
void Refresh();

我们使用FileInfo对FileSystemInfo类进行动手练习:

代码语言:javascript
复制
FileSystemInfo fileInfo = new FileInfo(@"C:\Temp\MyTest.txt");
//删除文件,不能在回收站找到
//fileInfo.Delete();
var attrs1 = fileInfo.Attributes;
var creationTime1 = fileInfo.CreationTime;
var lastAccessTime1 = fileInfo.LastAccessTime;
var lastWriteTime1 = fileInfo.LastWriteTime;
var exists1 = fileInfo.Exists;
var extension1 = fileInfo.Extension;
var fullName1 = fileInfo.FullName;
var name1 = fileInfo.Name;
//TODO:
//case 1: 打开文件,不修改
//case 2: 修改文件内容
//访问和修改文件之后,通过Refresh可以刷新fileInfo对象的信息
fileInfo.Refresh();
var attrs2 = fileInfo.Attributes;
var creationTime2 = fileInfo.CreationTime;
var lastAccessTime2 = fileInfo.LastAccessTime;
var lastWriteTime2 = fileInfo.LastWriteTime;
var exists2 = fileInfo.Exists;
var extension2 = fileInfo.Extension;
var fullName2 = fileInfo.FullName;
var name2 = fileInfo.Name;

if (lastAccessTime1 != lastAccessTime2)
{
  Console.WriteLine("lastAccessTime: {0}->{1}", lastAccessTime1, lastAccessTime2);
}
if (lastWriteTime1 != lastWriteTime2)
{
  Console.WriteLine("lastWriteTime: {0}->{1}", lastWriteTime1, lastWriteTime2);
}

FileInfo类:它代表着一个具体的文件,用它可以完成对文件的检查,打开,读取,创建,复制,剪切,加密,解密,删除等操作。

FileInfo类的构造函数:

代码语言:javascript
复制
//通过传入一个文件路径,可以初始化一个FileInfo对象。
public FileInfo(string fileName);

它的属性:

代码语言:javascript
复制
//表明文件是否存在
override bool Exists;
//获取文件名(包含后缀名)。
override string Name;
//获取文件对象所在的目录对象
DirectoryInfo Directory;
//获取文件对象所在的目录对象的名称??TODO 测试
string DirectoryName;
//表示当前文件对象是否只读
bool IsReadOnly;
//返回当前文件对象的字节流长度
long Length;

它的方法:

代码语言:javascript
复制
//返回文件的完整路径
override string ToString();
//删除文件
override void Delete();
//已Append的方式打开文件流,并返回StreamWriter对象,可以对文件写入字符文本
StreamWriter AppendText();
//将现有文件复制到新文件,不允许覆盖现有文件。
FileInfo CopyTo(string destFileName);
FileInfo CopyTo(string destFileName, bool overwrite);
//创建一个文件,并返回文件流对象,有读写权限
FileStream Create();
//创建一个文件,并返回StreamWriter对象,可以对文件写入字符文本
StreamWriter CreateText();
//加密文件,只有用于加密文件的帐户才能对其进行解密。
void Encrypt();
//使用encrypt方法解密当前帐户加密的文件。
void Decrypt();
//将指定的文件移动到新位置,并指定新文件名。
void MoveTo(string destFileName);
//根据指定的模式,打开文件流
FileStream Open(FileMode mode);
FileStream Open(FileMode mode, FileAccess access);
//只读权限打开文件流
FileStream OpenRead();
//打开文件流,返回StreamReader对象,可以从流中方便地读取文本字符
StreamReader OpenText();
//用写权限打开文件流
FileStream OpenWrite();
//用当前对象所描述的文件替换指定文件的内容,删除原始文件并创建替换文件的备份。
FileInfo Replace(string destinationFileName, string destinationBackupFileName);

我们对FileInfo进行动手练习:

代码语言:javascript
复制
FileInfo info = new FileInfo(@"C:\Temp\MyFile3.txt");
// C:\\Temp
DirectoryInfo directoryInfo = info.Directory;
// C:\\Temp
string directoryName = info.DirectoryName;
//false
bool isReadOnly = info.IsReadOnly;
//文件内容的字节长度
long length = info.Length;
// C:\\Temp\\MyFile.txt
string toString = info.ToString();
//以Append的方式写文件
//using (StreamWriter streamWriter = info.AppendText())
//{
//    streamWriter.Write("~~");
//}

//复制文件
//FileInfo info2 = info.CopyTo(@"C:\Temp\MyFile2.txt");

//覆盖文件
//FileInfo info3 = info.CopyTo(@"C:\Temp\MyFile2.txt", true);

//创建一个文件,如果原来就有文件,会被新文件覆盖掉,返回创建的文件流对象,拥有读写权限
//using (FileStream fileStream = info.Create())
//{
//    byte[] array = Encoding.UTF8.GetBytes("Hello");
//    fileStream.Write(array, 0, array.Length);
//}

//创建一个文件,如果原来就有文件,会被新文件覆盖掉,返回创建的文件流对象,拥有读写权限
//using (StreamWriter streamWriter = info.CreateText())
//{
//    streamWriter.Write("a");
//}

//剪切文件到新地址,可以使用它实现rename功能
//info.MoveTo(@"C:\Temp\MyFile3.txt");

//打开文件,加载文件流,有读写权限
//using (FileStream fileStream = info.Open(FileMode.OpenOrCreate))
//{
//    byte[] array = Encoding.UTF8.GetBytes("Hello2");
//    fileStream.Write(array, 0, array.Length);
//}

//打开文件,加载文件流,只读权限
//using (FileStream fileStream = info.OpenRead())
//{
//    byte[] array = new byte[3];
//    fileStream.Read(array, 0, array.Length);
//    string str = Encoding.UTF8.GetString(array);
//}

//打开文件,加载文件流,只写权限
//using (FileStream fileStream = info.OpenWrite())
//{
//    byte[] array = Encoding.UTF8.GetBytes("Hi");
//    fileStream.Write(array, 0, array.Length);
//}

//using (StreamReader streamReader = info.OpenText())
//{
//    char[] array = new char[3];
//    streamReader.Read(array,0,array.Length);
//    string str = new string(array);
//}

//info.Replace(@"C:\Temp\MyFile2.txt", @"C:\Temp\MyFile2_backup.txt");

DirectoryInfo类:它代表着一个具体的目录,用它可以完成对目录的检查,打开,读取,创建,复制,删除,剪切等操作。

DirectoryInfo类的构造函数:

代码语言:javascript
复制
//在指定路径上初始化DirectoryInfo新实例
public DirectoryInfo(string path);

它的属性:

代码语言:javascript
复制
override bool Exists;
override string FullName;
override string Name;
DirectoryInfo Parent;
DirectoryInfo Root;

它的方法:

代码语言:javascript
复制
//返回目录的完整路径
override string ToString();
//如果这个目录是空目录,删除它
override void Delete();
//删除当前目录,并指定是否删除子目录和文件。
void Delete(bool recursive);

//创建一个目录
void Create();
void Create(DirectorySecurity directorySecurity);
//在指定路径上创建一个或多个子目录。指定的路径是当前目录对象的相对于路径。
DirectoryInfo CreateSubdirectory(string path);
DirectoryInfo CreateSubdirectory(string path, DirectorySecurity directorySecurity);

//将this实例及其内容移动到新路径。
void MoveTo(string destDirName);

//返回当前目录中所有的目录信息。
IEnumerable<DirectoryInfo> EnumerateDirectories();
//searchPattern默认是*,返回所有的目录
IEnumerable<DirectoryInfo> EnumerateDirectories(string searchPattern);
IEnumerable<DirectoryInfo> EnumerateDirectories(string searchPattern, SearchOption searchOption);
//返回当前目录中所有的文件信息。
IEnumerable<FileInfo> EnumerateFiles();
IEnumerable<FileInfo> EnumerateFiles(string searchPattern);
IEnumerable<FileInfo> EnumerateFiles(string searchPattern, SearchOption searchOption);
//返回当前目录中所有的文件或者目录信息
IEnumerable<FileSystemInfo> EnumerateFileSystemInfos();
IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(string searchPattern);
IEnumerable<FileSystemInfo> EnumerateFileSystemInfos(string searchPattern, SearchOption searchOption);
//返回当前目录的子目录。
DirectoryInfo[] GetDirectories();
DirectoryInfo[] GetDirectories(string searchPattern);
DirectoryInfo[] GetDirectories(string searchPattern, SearchOption searchOption);
//返回当前目录的文件。
FileInfo[] GetFiles();
FileInfo[] GetFiles(string searchPattern);
FileInfo[] GetFiles(string searchPattern, SearchOption searchOption);
//返回当前目录的子目录或者文件。
FileSystemInfo[] GetFileSystemInfos();
FileSystemInfo[] GetFileSystemInfos(string searchPattern);
FileSystemInfo[] GetFileSystemInfos(string searchPattern, SearchOption searchOption);

DirectorySecurity GetAccessControl();
void SetAccessControl(DirectorySecurity directorySecurity);

我们对DirectoryInfo进行动手练习:

代码语言:javascript
复制
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Temp");

bool exists = directoryInfo.Exists;
// C:\\Temp
string fullName = directoryInfo.FullName;
// Temp
string name = directoryInfo.Name;
// C:\\
DirectoryInfo parent = directoryInfo.Parent;
// C:\\
DirectoryInfo root = directoryInfo.Root;
// C:\\Temp
string toString = directoryInfo.ToString();

// Error: The directory is not empty.
//directoryInfo.Delete();

// 删除这个目录和里面的所有子项
//directoryInfo.Delete(true);

// 创建目录,已经存在则自动跳过
//directoryInfo.Create();

//在指定路径上创建一个或多个子目录。指定的路径是当前目录对象的相对于路径。
//directoryInfo.CreateSubdirectory(@"bbb\ccc\ddd");

//剪切当前的目录到新目录,可以实现rename功能
//directoryInfo.MoveTo(@"C:\Temp2");

//获取子目录
var directoryInfos1 = directoryInfo.EnumerateDirectories().ToList();
var directoryInfos2 = directoryInfo.EnumerateDirectories("aa*").ToList();
var directoryInfos3 = directoryInfo.EnumerateDirectories("aa*", SearchOption.AllDirectories).ToList();

//获取子文件
var fileInfos1 = directoryInfo.EnumerateFiles().ToList();
var fileInfos2 = directoryInfo.EnumerateFiles("aa*").ToList();
var fileInfos3 = directoryInfo.EnumerateFiles("aa*", SearchOption.AllDirectories).ToList();

//获取子目录和子文件
var fileSystemInfos1 = directoryInfo.EnumerateFileSystemInfos().ToList();
var fileSystemInfos2 = directoryInfo.EnumerateFileSystemInfos("aa*").ToList();
var fileSystemInfos3 = directoryInfo.EnumerateFileSystemInfos("aa*", SearchOption.AllDirectories).ToList();

//GetDirectories,GetFiles,GetFileSystemInfos和上面的情况类似

总结全文,我们仔细地学习了FileInfo,DirectoryInfo和FileSystemInfo三个类,通过FileInfo以及DirectoryInfo类可以实现各种花式的文件操作,而且如何初始化它们呢?仅仅需要提供一个path而已。

-纸上得来终觉浅,绝知此事要躬行-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 明丰随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档