第十八章 数据访问(In .net4.5) 之 I/O操作
1. 概述
本章内容包括 文件操作、流操作、读写网络数据 以及 异步I/O操作。
2. 主要内容
2.1 文件操作
① 使用 Drive 和 DriveInfo 访问磁盘信息。
DriveInfo[] drivesInfo = DriveInfo.GetDrives(); foreach (DriveInfo driveInfo in drivesInfo)
{
Console.WriteLine(“Drive {}”, driveInfo.Name);
Console.WriteLine(“ File type: {}”, driveInfo.DriveType); if (driveInfo.IsReady == true)
{
Console.WriteLine(“ Volume label: {}”, driveInfo.VolumeLabel);
Console.WriteLine(“ File system: {}”, driveInfo.DriveFormat);
Console.WriteLine(
“ Available space to current user:{, } bytes”,
driveInfo.AvailableFreeSpace); Console.WriteLine(
“ Total available space: {, } bytes”,
driveInfo.TotalFreeSpace); Console.WriteLine(
“ Total size of drive: {, } bytes “,
driveInfo.TotalSize);
}
}
② 可以使用 DictionaryInfo 和 Dictionary 来操作目录信息。
var directory = Directory.CreateDirectory(@”C:\Temp\ProgrammingInCSharp\Directory”);
var directoryInfo = new DirectoryInfo(@”C:\Temp\ProgrammingInCSharp\DirectoryInfo”);
directoryInfo.Create();
*使用DictionarySecurity可以操作目录权限。
DirectoryInfo directoryInfo = new DirectoryInfo(“TestDirectory”);
directoryInfo.Create();
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
directorySecurity.AddAccessRule(
new FileSystemAccessRule(“everyone”,
FileSystemRights.ReadAndExecute,
AccessControlType.Allow));
directoryInfo.SetAccessControl(directorySecurity);
*使用 EnumerateDirectories 代替 GetDirectories,会更有效率。
③ 可以使用 File 和 FileInfo 来操作文件信息。
string path = @”c:\temp\test.txt”; if (File.Exists(path))
{
File.Delete(path);
} FileInfo fileInfo = new FileInfo(path); if (fileInfo.Exists)
{
fileInfo.Delete();
}
④ 可以使用 Path 类来操作路径信息。
string folder = @”C:\temp”;
string fileName = “test.dat”;
string fullPath = Path.Combine(folder, fileName); // Results in C:\\temp\\test.dat
*使用 Path 类 还可以实现使用临时文件来保存信息( GetRandomFileName, GetTempPath, GetTempFileName)
2.2 流操作
① Stream基类
② 编码和解码
编码解码是在字符与字节间的转换操作。
.net平台提供的编码格式包括:UTF-8, ASCII, BigEndianUnicode, Unicode, UTF32 和 UTF7.
使用File类的CreateText、OpenRead、OpenText方法,可以通过返回的StreamWriter、FileStream、StreamReader类,用默认编码的方式快捷的进行转换操作。
③ 使用各种类型的流
使用GZipStream压缩数据
string folder = @»c:\temp»;
string uncompressedFilePath = Path.Combine(folder, “uncompressed.dat”);
string compressedFilePath = Path.Combine(folder, “compressed.gz”);
byte[] dataToCompress = Enumerable.Repeat((byte)’a’, * ).ToArray();
using (FileStream uncompressedFileStream = File.Create(uncompressedFilePath))
{
uncompressedFileStream.Write(dataToCompress, , dataToCompress.Length);
}
using (FileStream compressedFileStream = File.Create(compressedFilePath))
{
using (GZipStream compressionStream = new GZipStream(
compressedFileStream, CompressionMode.Compress))
{
compressionStream.Write(dataToCompress, , dataToCompress.Length);
}
} FileInfo uncompressedFile = new FileInfo(uncompressedFilePath);
FileInfo compressedFile = new FileInfo(compressedFilePath); Console.WriteLine(uncompressedFile.Length); // Displays 1048576
Console.WriteLine(compressedFile.Length); // Displays 1052
使用 BufferedStream 一次读写大块数据(通过内存中的缓冲区读写数据,半阻塞式)
string path = @»c:\temp\bufferedStream.txt»; using (FileStream fileStream = File.Create(path))
{
using (BufferedStream bufferedStream = new BufferedStream(fileStream))
{
using (StreamWriter streamWriter = new StreamWriter(bufferedStream))
{
streamWriter.WriteLine(«A line of text.»);
}
}
}
* 现代操作系统是一个多线程的环境,在其上执行文件操作时(File.Exists不一定可靠),实现完善的异常处理机制是很有必要的。
string path = @”C:\temp\test.txt”; try
{
return File.ReadAllText(path);
}
catch (DirectoryNotFoundException) { }
catch (FileNotFoundException) { }
return string.Empty;
2.3 网络通信
① WebRequest 和 WebResponse
WebRequest request = WebRequest.Create(“http://www.microsoft.com”);
WebResponse response = request.GetResponse(); StreamReader responseStream = new StreamReader(response.GetResponseStream());
string responseText = responseStream.ReadToEnd(); Console.WriteLine(responseText); // Displays the HTML of the website response.Close();
2.4 异步I/O操作
① Async/await
public async Task CreateAndWriteAsyncToFile()
{
using (FileStream stream = new FileStream(“test.dat”, FileMode.Create,
FileAccess.Write, FileShare.None, , true))
{
byte[] data = new byte[];
new Random().NextBytes(data); await stream.WriteAsync(data, , data.Length);
}
}
public async Task ReadAsyncHttpRequest()
{
HttpClient client = new HttpClient();
string result = await client.GetStringAsync(“http://www.microsoft.com”);
}
② 并行操作(Parallel)
public async Task ExecuteMultipleRequestsInParallel()
{
HttpClient client = new HttpClient(); Task microsoft = client.GetStringAsync(“http://www.microsoft.com”);
Task msdn = client.GetStringAsync(“http://msdn.microsoft.com”);
Task blogs = client.GetStringAsync(“http://blogs.msdn.com/”); await Task.WhenAll(microsoft, msdn, blogs); //相比使用三个await更高效
}
3. 总结
① 使用 Drive 和 DriveInfo 操作磁盘。
② 使用Dictionary 和 DictionaryInfo 操作文件夹。
③ 使用 File 和 FileInfo 操作文件。
④ 使用 Path 类来操作路径信息。
⑤ 流是对一组字节的抽象。
⑥ 时刻谨记文件系统是可以同时被多用户操作的。
⑦ 使用WebRequest 和 WebResponse 来进行网络请求操作。
⑧ 异步I/O操作可以提升用户体验和程序的可靠性。
第十八章 数据访问(In .net4.5) 之 I/O操作的更多相关文章
- Spring 4 官方文档学习(十)数据访问之JDBC
说明:未修订版,阅读起来极度困难 1.Spring框架JDBC的介绍 Spring JDBC - who does what? 动作 Spring 你 定义连接参数 是 打开连接 是 指定SQ ...
- Spring 4 官方文档学习(十)数据访问之DAO支持
1.介绍 Spring 中 Data Access Object (DAO)支持 的目标是以一种一致的方式更简单的使用JDBC.Hibernate.JPA或JDO等数据访问技术.可以在前面说的几种数据 ...
- 第二十二章 数据访问(In .net4.5) 之 集合
1. 概述 本章内容包括 .net平台中的集合.如何选择集合 以及 如何实现自定义集合. 2. 主要内容 2.1 使用数组(Array) ]; ; x < arrayOfInt.Length; ...
- 第十九章 数据访问(In .net4.5) 之 处理数据
1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...
- 第二十一章 数据访问(In .net4.5) 之 序列化
1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以 ...
- 第二十章 数据访问(In .net4.5) 之 使用LINQ
1. 概述 .net3.5中新添加给C#的LINQ查询,提供了直观便捷的数据查询方式.并且支持多种数据源的查询. 本章介绍标准的LINQ操作,如何用最优的方式使用LINQ 以及 LINQ to XML ...
- Spring 4 官方文档学习(十)数据访问之OXM
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...
- Spring 4 官方文档学习(十)数据访问之ORM
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html 占位用,暂略.
- 使用JDBC构建简单的数据访问层
本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...
随机推荐
- struts2+hibernate+poi导出Excel实例
本实例通过struts2+hibernate+poi实现导出数据导入到Excel的功能 用到的jar包: poi 下载地址:http://poi.apache.org/ 根据查询条件的选择显示相应数据 ...
- Hive基础之Hive开启查询列名及行转列显示
Hive默认情况下查询结果里面是只显示值: hive> select * from click_log; OK ad_101 :: ad_102 :: ad_103 :: ad_104 :: a ...
- 剑指Offer:面试题3——二维数组中的查找(java实现)
问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:取数组中的元素与 ...
- python学习(一):环境安装及HelloWorld
一.安装注意事项: 在安装python的第三方库时,(平台是win)要 注意所下载的包的版本,一要与所安装的python版本相对应,同时还有注意操作系统的位数(32位还是64位).下载好后,先将c:\ ...
- java解析xml的4种经典方法
========================================== xml文件 <?xml version="1.0" encoding="GB2 ...
- 百度校招面试经历及总结(已发offer)
听说发面经可以攒rp,希望早点给我确定的offer通知,也希望看到这个面经的小伙伴能顺利拿到心仪的offer~ 职位:机器学习-数据挖掘工程师 9.15 上午11点 一面 1.介绍项目 2.考研意向, ...
- 数据结构(一)之HelloWord
最近由于学习上面的需要,要重新的看看数据结构方面的知识!当然,我觉得数据结构也非常的重要,下面是我的学习的一点小小的记录,以备日后的查看! 我的环境: 1:操作系统:windows7 2:编码环境:M ...
- Eclipse SVN冲突解决
基本原则是:每次提交前需要先和线上的对比,先把冲突解决掉,然后把线上的更新到本地,最后把本地的提交上去. 右键项目 -> Team -> 与资源库同步 在同步视图中选择Conflicts ...
- Java中几种常见的排序方式
冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字 ...
- 二模10day2解题报告
T1.最多因子数(divisors) 给出范围l,r求其中约数和最大的最小整数. 非常深井冰的题目:如果特判加暴力的话分数低的可怜 AC做法要用到分解质因数和线性筛(这俩好写),然而,一个一个枚举还是 ...