文件与流
大部分类在System.IO命名空间下。
文件
FileSystemInfo——表示任何文件系统对象的基类。
FileInfo和File——表示文件系统上的文件。
DirectoryInfo和Directory ——表示文件系统上的文件夹(windows称法)。
Path——这个类包含的静态成员可以用于处理路径名。
DriveInfo——提供了指定驱动器的信息。
File和Directory
都是静态类,提供了一些对文件和目录的常用操作。
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
//复制
File.Copy(txtFilePath, "./My1.txt",true);
//读取
string content = File.ReadAllText(txtFilePath);
Console.WriteLine(content);
//写入
File.WriteAllText(txtFilePath, "aaaaaaa");
//是否存在
Console.WriteLine(File.Exists(txtFilePath));
//创建时间
Console.WriteLine(File.GetCreationTime(txtFilePath));
//最后写入时间
Console.WriteLine(File.GetLastWriteTime(txtFilePath));
//删除
File.Delete(txtFilePath);
}
}
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
//当前目录
Console.WriteLine(Directory.GetCurrentDirectory());
//是否存在
Console.WriteLine(Directory.Exists("../"));
//创建文件夹
Console.WriteLine(Directory.CreateDirectory("./abc"));
//删除文件夹
Directory.Delete("./abc");
//父路径
Console.WriteLine(Directory.GetParent("./").FullName);
}
}
FileInfo和DirectoryInfo
这两个类和File、Directory类差不多,不过他们是有状态的,因为在实例化过程中会读取文件或目录的一些状态信息,适用于对一个文件和目录多次操作的场景。
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
DirectoryInfo info = new DirectoryInfo(@"C:\Users\lch\Downloads\Ghelper2.2.1.all");
//递归打印给定目录及子目录的所有文件
PrintAll(info);
}
void PrintAll(DirectoryInfo info)
{
if (!info.Exists)
{
Console.WriteLine("目录不存在");
}
foreach (var item in info.GetFiles())
{
Console.WriteLine(item.Name);
}
foreach (var item in info.GetDirectories())
{
PrintAll(item);
}
}
}
Path
静态类,可以对路径进行操作。
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
//合并路径
Console.WriteLine(Path.Combine(@"c:\myhome", "codeTest"));
//当前用户临时文件夹
Console.WriteLine(Path.GetTempPath());
//目录分隔符
Console.WriteLine(Path.AltDirectorySeparatorChar);
//目录分隔符
Console.WriteLine(Path.DirectorySeparatorChar);
//划分环境变量的分隔符,默认是分号
Console.WriteLine(Path.PathSeparator);
//卷分隔符,默认冒号
Console.WriteLine(Path.VolumeSeparatorChar);
}
}
DriveInfo
这个类可以访问驱动器信息。
[TestClass]
public class UnitTest3
{
[TestMethod]
public void TestFile()
{
foreach (var item in DriveInfo.GetDrives())
{
Console.Write("驱动器名称:");
Console.WriteLine(item.Name);
Console.Write("驱动器可用空闲空间总字节数:");
Console.WriteLine(item.TotalFreeSpace);
Console.Write("驱动器存储空间总字节数:");
Console.WriteLine(item.TotalSize);
Console.Write("驱动器可用空闲空间总字节数:");
Console.WriteLine(item.AvailableFreeSpace);
Console.Write("文件系统名称:");
Console.WriteLine(item.DriveFormat);
Console.Write("驱动器类型:");
Console.WriteLine(item.DriveType.ToString());
Console.Write("驱动器的卷标:");
Console.WriteLine(item.VolumeLabel);
Console.Write("驱动器的根目录:");
Console.WriteLine(item.RootDirectory);
Console.WriteLine();
Console.WriteLine();
}
}
}
流
流表示描述数据传输的对象,它有两个方向,读和写。
Stream是所有流的基类
MemoryStream是对内存进行读写的流
FileStream用于以二进制方式读写文件
StreamReader和StreamWriter用于读写文本文件。
BufferedStream表示缓存的流,它会将文件的一个大块放在内存中缓存,对内存进行操作,然后择机刷入磁盘。
BinaryReader和BinaryWriter是两个装饰类,用于封装流操作
流使用完毕应该关闭,释放资源
FileStream
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
//读取一个只有ASCII字符的文件
//FileMode为打开模式,FileAccess为读取
FileStream sf = new FileStream(txtFilePath, FileMode.Open, FileAccess.Read);
byte[] bytes = new byte[1 << 12];
int count;
StringBuilder sb = new StringBuilder();
while ((count=sf.ReadByte())!=-1)
{
char c = (char)count;
sb.Append(c);
}
sf.Close()
Console.WriteLine(sb.ToString());
}
}
StreamReader和StreamWriter
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
//文本读取,可以指定编码方式
StreamReader sr = new StreamReader(txtFilePath, Encoding.UTF8);
string content = sr.ReadToEnd();
Console.WriteLine(content);
sr.Close();
//构造函数第二个参数为true代表追加写入,否则为覆盖,可以指定编码方式
StreamWriter sw = new StreamWriter(txtFilePath, true, Encoding.UTF8);
sw.WriteLine("ABCDEFG");
sw.WriteLine("POIJNMK");
sw.Close();
}
}
映射内存的文件
相关类在System.IO.MemoryMappedFiles命名空间下。
这种方式会把文件的一块或全部映射到内存的一块区域上,并提供给应用程序访问,这个内存区域可被多个进程共享。
[TestClass]
public class UnitTest3
{
static string txtFilePath="../../Test.txt";
[TestMethod]
public void TestFile()
{
//从物理文件中创建映射内存的文件
using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile(txtFilePath, FileMode.Create, "txtFile", 1 << 20))
{
string content = "qweqeqewadad" + DateTime.Now.ToString();
//创建访问器对象
MemoryMappedViewAccessor accessor = mappedFile.CreateViewAccessor();
accessor.WriteArray(0, Encoding.ASCII.GetBytes(content), 0, content.Length);
}
}
}
访问控制列表(ACL)
文件的ACL操作
using System.Security.AccessControl;
using System.Security.Principal;
using System;
using System.IO;
[TestClass]
public class UnitTest3
{
[TestMethod]
public void TestFile()
{
try
{
using (FileStream fs = new FileStream(txtFilePath, FileMode.Open, FileAccess.Read))
{
//获取ACL
FileSecurity fileSecurity = fs.GetAccessControl();
//包括显示设置的规则和继承的规则,每个访问权限都用一个FileSystemAccessRule表示
foreach (FileSystemAccessRule item in fileSecurity.GetAccessRules(true, true, typeof(NTAccount)))
{
Console.WriteLine("{0} {1} {2} access for {3}", txtFilePath,
item.AccessControlType == AccessControlType.Allow ? "provides" : "denies",
item.FileSystemRights, item.IdentityReference);
}
//添加规则,NTAccount代表的账户必须已存在
FileSystemAccessRule ar = new FileSystemAccessRule(new NTAccount(@"SA\lins"), FileSystemRights.FullControl, AccessControlType.Allow);
fileSecurity.AddAccessRule(ar);
File.SetAccessControl(txtFilePath, fileSecurity);
//删除规则
fileSecurity.RemoveAccessRule(ar);
File.SetAccessControl(txtFilePath, fileSecurity);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}