(十四)IO操作

文件与流

大部分类在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);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值