第十八章 数据访问(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 {0}”, driveInfo.Name);
    Console.WriteLine(“  File type: {0}”, driveInfo.DriveType); 

    if (driveInfo.IsReady == true)
    {
        Console.WriteLine(“  Volume label: {0}”, driveInfo.VolumeLabel);
        Console.WriteLine(“  File system: {0}”, driveInfo.DriveFormat);
        Console.WriteLine(
            “  Available space to current user:{0, 15} bytes”,
            driveInfo.AvailableFreeSpace); 

        Console.WriteLine(
            “  Total available space:          {0, 15} bytes”,
            driveInfo.TotalFreeSpace); 

        Console.WriteLine(
            “  Total size of drive:            {0, 15} 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’, 1024 * 1024).ToArray();
using (FileStream uncompressedFileStream = File.Create(uncompressedFilePath))
{
    uncompressedFileStream.Write(dataToCompress, 0, dataToCompress.Length);
}
using (FileStream compressedFileStream = File.Create(compressedFilePath))
{
    using (GZipStream compressionStream = new GZipStream(
                compressedFileStream, CompressionMode.Compress))
    {
        compressionStream.Write(dataToCompress, 0, 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, 4096, true))
    {
        byte[] data = new byte[100000];
        new Random().NextBytes(data); 

        await stream.WriteAsync(data, 0, 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操作可以提升用户体验和程序的可靠性。

    
时间: 2024-07-30 11:22:19

第十八章 数据访问(In .net4.5) 之 I/O操作的相关文章

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

1.Spring框架JDBC的介绍 Spring JDBC - who does what? 动作 Spring 你 定义连接参数   是 打开连接 是   指定SQL语句   是 声明参数,提供参数值   是 准备.执行语句 是   迭代结果(如果有) 是   操作每个迭代   是 处理任何异常 是   处理事务 是   关闭连接.语句.结果集 是   一句话,Spring框架负责所有的低级别细节操作. 1.1.选择JDBC数据库访问的路径 所有的路径都需要兼容JDBC 2.0的驱动,部分特性

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

1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以及 为序列化配置对象. 2. 主要内容 2.1 序列化与反序列化 序列化只能保存对象的数据部分,不能保存方法部分.可以创建custom data transfer object(DTO)来只保存指定的数据信息. .net平台提供三种类型的序列化: ① XmlSerializer: [Serializ

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

1. 概述 .net3.5中新添加给C#的LINQ查询,提供了直观便捷的数据查询方式.并且支持多种数据源的查询. 本章介绍标准的LINQ操作,如何用最优的方式使用LINQ 以及 LINQ to XML. 2. 主要内容 2.1 使LINQ可行的语言特性 ① 隐式类型(Implicitly typed variables): 使用var标记,由编译器推断类型.也是强命名的. ② 对象初始化语法(Object initialization syntax):用一种简洁的语法进行对象初始化. var p

实体类,数据访问类.字符串攻击.防攻击

程序分三层:界面层.业务逻辑层.数据访问层 这里主要操作的是数据访问层,数据访问层又分为: 1.实体类 2.数据访问类 存放位置:APP_Code文件中 一.实体类 最简单的封装把数据库的表名变成类的类名把数据库的每一个列,变为实体类中的成员变量和属性列名与属性名一致 有几行就有几个实体类 这是一个简单的实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namesp

【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,为了看起来一致. using System; using

系统架构师-基础到企业应用架构-数据访问层

一.上章回顾 上篇我们简单讲述了服务层架构模式中的几种,并且讲解了服务层的作用及相关的设计规范,其实我们应该知道,在业务逻辑层中使用领域模型中使用服务层才 能发挥出最大的优势,如果说我们在业务逻辑层还是使用非领域模型的模式话,服务层的作用仅体现在解耦作用.其实在业务逻辑层采用领域模型时,我们前面说的持 久化透明的技术,其实我们可以通过服务层来做,我们在服务层中处理领域对象信息的持久化操作.当然本篇可能不会深入讨论持久化透明的具体实现,后面会单独开 篇来讲述,我们先来回顾下上篇讲解的内容:  上图

2017-4-20实体类,数据访问类.字符串攻击.防攻击

程序分三层:界面层.业务逻辑层.数据访问层 这里主要操作的是数据访问层,数据访问层又分为: 1.实体类 2.数据访问类 存放位置:APP_Code文件中 一.实体类 最简单的封装把数据库的表名变成类的类名把数据库的每一个列,变为实体类中的成员变量和属性列名与属性名一致 有几行就有几个实体类 这是一个简单的实体类:  实体类 二.数据访问类 将某个表的数据库操作写成一个一个方法,放入到此类中供外部调用 这是一个数据访问类:  数据访问类 三.字符串攻击,防攻击 字符串攻击: 主要利用获取需用户输入

关于面对对象过程中的三大架构以及数据访问层(实体类、数据操作类)

面向对象开发项目三层架构: 界面层.业务逻辑层.数据访问层 数据访问层,分为实体类和数据访问类 在项目的下面添加一个App_Code文件夹把所有的类放在App_Code这个文件夹下边. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性(也就是对每个数据库中的字段封装) 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表