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

2019-07-17 15:14:06 浏览数 (1)

在.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:TempMyTest.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:TempMyFile3.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:TempMyFile2.txt");

//覆盖文件
//FileInfo info3 = info.CopyTo(@"C:TempMyFile2.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:TempMyFile3.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:TempMyFile2.txt", @"C:TempMyFile2_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(@"bbbcccddd");

//剪切当前的目录到新目录,可以实现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而已。

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

0 人点赞