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操作的更多相关文章

  1. Spring 4 官方文档学习(十)数据访问之JDBC

    说明:未修订版,阅读起来极度困难 1.Spring框架JDBC的介绍 Spring JDBC - who does what? 动作 Spring 你 定义连接参数   是 打开连接 是   指定SQ ...

  2. Spring 4 官方文档学习(十)数据访问之DAO支持

    1.介绍 Spring 中 Data Access Object (DAO)支持 的目标是以一种一致的方式更简单的使用JDBC.Hibernate.JPA或JDO等数据访问技术.可以在前面说的几种数据 ...

  3. 第二十二章 数据访问(In .net4.5) 之 集合

    1. 概述 本章内容包括 .net平台中的集合.如何选择集合 以及 如何实现自定义集合. 2. 主要内容 2.1 使用数组(Array) ]; ; x < arrayOfInt.Length;  ...

  4. 第十九章 数据访问(In .net4.5) 之 处理数据

    1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...

  5. 第二十一章 数据访问(In .net4.5) 之 序列化

    1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以 ...

  6. 第二十章 数据访问(In .net4.5) 之 使用LINQ

    1. 概述 .net3.5中新添加给C#的LINQ查询,提供了直观便捷的数据查询方式.并且支持多种数据源的查询. 本章介绍标准的LINQ操作,如何用最优的方式使用LINQ 以及 LINQ to XML ...

  7. Spring 4 官方文档学习(十)数据访问之OXM

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...

  8. Spring 4 官方文档学习(十)数据访问之ORM

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html 占位用,暂略.

  9. 使用JDBC构建简单的数据访问层

    本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...

随机推荐

  1. 分享一个基于EF5.0封装的BaseDAL

    public class BaseDAL<T> where T : class,new() { protected DbContext dbContext = DbContextFacto ...

  2. php中检查文件或目录是否存在的代码小结

    检查文件或目录是否存在 ,我们使用了php中常用的函数file_exists,这个函数就可以实现我想要的功能,下面大家慢慢参考一下下面是一个简单的检查文件是否存在的实例代码: <?php $fi ...

  3. 在虚拟机上安装红帽Linux.5.5.for.x86.服务器版系统(按针对安装oracle 10g作的配置)

    在虚拟机上安装红帽Linux.5.5.for.x86.服务器版系统(按针对安装oracle 10g作的配置)   软件版本: 虚拟机版本:vmwareworkstation 7.11 build-28 ...

  4. C and C++ 如何嵌套使用

    1. 要知道extern "C"的含义: (1) extern是C/C++中表明函数和全局变量作用范围的关键字, 该关键字表明其申明的函数和变量可以在本模块或者其他模块中使用. ( ...

  5. opencv基于HSV的肤色分割

    //函数功能:在HSV颜色空间对图像进行肤色模型分割 //输入:src-待处理的图像,imgout-输出图像 //返回值:返回一个iplimgae指针,指向处理后的结果 IplImage* SkinS ...

  6. 解决IllegalStateException: Can not perform this action after onSaveInstanceState

    今天使用Fragment的时候,出现了这个错误 IllegalStateException: Can not perform this action after onSaveInstanceState ...

  7. [转载]python中multiprocessing.pool函数介绍

    原文地址:http://blog.sina.com.cn/s/blog_5fa432b40101kwpi.html 作者:龙峰 摘自:http://hi.baidu.com/xjtukanif/blo ...

  8. Web前端面试常识

    大四校招即将席卷而来,现在临时抱抱佛脚,百度一下大概可能会问到的知识点,愿与君共勉吧! 1.Doctype(html4) A.strict   严格版本 B.transitional  过渡版本(防止 ...

  9. Android开发-API指南-进程与线程

    Processes and Threads 英文原文:http://developer.android.com/guide/components/processes-and-threads.html ...

  10. java.lang.NoSuchMethodException

    这个异常遇到过若干次,提示信息也比较清楚的指示出它的特点,当无法找到某一特定方法时,就会抛出该异常! 我所遇到的抛出此异常的情景主要有以下两种: 1:对应的JAVA类中没有对应的属性,也就是说在页面的 ...