一、FileStream的基础知识


  属性:
           CanRead 判断当前流是否支持读取,返回bool值,True表示可以读取
           CanWrite 判断当前流是否支持写入,返回bool值,True表示可以写入


  方法:
           Read() 从流中读取数据,返回字节数组
           Write() 将字节块(字节数组)写入该流
           Seek() 设置文件读取或写入的起始位置
           Flush() 清除该流缓冲区,使得所有缓冲的数据都被写入到文件中
           Close() 关闭当前流并释放与之相关联的所有系统资源


  文件的访问方式:(FileAccess)
           FileAccess.Read(对文件读访问)
           FileAccess.Write(对文件进行写操作)
           FileAccess.ReadWrite(对文件读或写操作)


  文件打开模式:(FileMode)包括6个枚举
          FileMode.Append 打开现有文件准备向文件追加数据,只能同FileAccess.Write一起使用
          FileMode.Create 指示操作系统应创建新文件,如果文件已经存在,它将被覆盖
          FileMode.CreateNew 指示操作系统应创建新文件,如果文件已经存在,将引发异常
          FileMode.Open 指示操作系统应打开现有文件,打开的能力取决于FileAccess所指定的值
          FileMode.OpenOrCreate 指示操作系统应打开文件,如果文件不存在则创建新文件
          FileMode.Truncate 指示操作系统应打开现有文件,并且清空文件内容


  文件共享方式:(FileShare)
         FileShare方式是为了避免几个程序同时访问同一个文件会造成异常的情况。

  文件共享方式包括四个:
        FileShare.None 谢绝共享当前文件
        FileShare.Read 充许别的程序读取当前文件
        FileShare.Write 充许别的程序写当前文件
        FileShare.ReadWrite 充许别的程序读写当前文

二、FileStream的异步操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading; namespace ConsoleStream
{
class Program
{
static void Main(string[] args)
{
string filePaths = @"E:\Test\Test\local\1.msi"; System.IO.FileInfo f = new FileInfo(@"E:\Test\Test\server\1.msi");
int fileLength = Convert.ToInt32(f.Length.ToString()); ThreadPool.SetMaxThreads(, );
Console.WriteLine("Start");
using (System.IO.FileStream stream = new System.IO.FileStream(filePaths, FileMode.Create, FileAccess.Write, FileShare.Write,, true))
{
for (int i = ; i < fileLength; i+= )
{
Console.WriteLine(i);
if (i == )
{
Console.WriteLine("Stop");
Thread.Sleep();
Console.WriteLine("Restart");
}
if(i==+)
{
Console.WriteLine("Next");
Thread.Sleep();
}
int length = (int)Math.Min(, fileLength - i);
var bytes = GetFile(i, length);
stream.Write(bytes, , length);
stream.BeginWrite(bytes, , length, new AsyncCallback(Callback), stream);
}
stream.Flush();
stream.Close();
stream.Dispose();
}
Console.ReadKey();
}
public static byte[] GetFile(int start, int length)
{
string filepath = @"E:\Test\Test\server\1.msi";
using (System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite,, true))
{
byte[] buffer = new byte[length];
fs.Position = start;
fs.BeginRead(buffer, , length, new AsyncCallback(Completed), fs);
return buffer;
}
} static void Completed(IAsyncResult result)
{
FileStream fs = (FileStream)result.AsyncState;
fs.EndRead(result);
fs.Close();
}
public static void Callback(IAsyncResult result)
{
FileStream stream = (FileStream)result.AsyncState;
stream.EndWrite(result);
}
}
}

1. 如果Callback里添一句:stream.Close(),肯定直接报错:无法访问已关闭的文件。因为是循环写文件,所以不能把流给关闭了。

2. 主程序里stream.Close()要写在stream.Flush()的后面,不然无法清除缓存,将缓存数据写入文件

C#基础-FileStream的更多相关文章

  1. C#基础-FileStream实现多线程断点续传

    一.前言 网上有许多的多线程断点续传操作,但总是写的很云里雾里,或者写的比较坑长.由于这几个月要负责公司的在线升级项目,所以正好顺便写了一下 代码如下: using System; using Sys ...

  2. C#基础学习之FileStream

    FileStream和File的区别  后者比前者给内存带来压力大. FileStream可以操作字节也就是可以保存任何类型的文件. 1.FileStream读文件操作 //OpenOrCreate: ...

  3. 20151024_003_C#基础知识(File / FileStream / StreamReader/StreamWriter)

    1:绝对路径和相对路径 绝对路径:通过给定的路径直接能在我的电脑中找到这个文件. 相对路径:文件相对于应用程序的路径. 2:编码格式 乱码:产生乱码的原因,就是你保存这个文件所采用的编码,跟你打开这个 ...

  4. 【基础巩固】文件流读写、大文件移动 FileStream StreamWriter File Path Directory/ ,m资料管理器(递归)

    C#获取文件名 扩展名 string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(f ...

  5. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  6. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

  7. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  8. .NET基础架构方法—DataTableToExcel通用方法

    p { display: block; margin: 3px 0 0 0; } --> .NET架构基础方法—DataTableToExcel通用方法(NPOI) 今天封装DataTaleTo ...

  9. 开通博客的第一天上传我的C#基础笔记,个人觉得很好用。

    1.索引器  string arrStr = "sddfdfgfh";  索引器的目的就是为了方便而已,可以在该类型的对象后面直接写[]访问该对象里面的成员  Console.Wr ...

随机推荐

  1. LB 负载均衡的层次结构

    作为后端应用的开发者,我们经常开发.调试.测试完我们的应用并发布到生产环境,用户就可以直接访问到我们的应用了.但对于互联网应用,在你的应用和用户之间还隔着一层低调的或厚或薄的负载均衡层软件,它们不显山 ...

  2. ASP.NET Core 数据保护(Data Protection)【上】

    前言 上一篇博客记录了如何在 Kestrel 中使用 HTTPS(SSL), 也是我们目前项目中实际使用到的. 数据安全往往是开发人员很容易忽略的一个部分,包括我自己.近两年业内也出现了很多因为安全问 ...

  3. 使用jQuery Uploadify在ASP.NET 上传附件

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.Uploadify官方网址:http://www.uploadify.com/,在MVC中使用的方法可以参考 jQuer ...

  4. 开源一个练手小App, PrintableCheckList

    A small but powerful App, only focus on one thing, make you easy to print out your checklist. It is ...

  5. JS实战 · 表格行颜色间隔显示,并在鼠标指定行上高亮显示

    思路: 1.获取所有行对象,将需要间隔颜色显示的行对象进行动态的className属性指定:      前提是:先定义好类选择器,就是说给行对象赋予name. 2.高亮用到两个事件:onmouseov ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

  7. How.To.Process.Image.Infomation.Of.Rotate.And.Flip.From.Server

    需求说明 客户端接收到服务器传送过来的图像数据,客户端通过对图像进行旋转和反转操作. 然后把这个旋转和反转的数据上传到服务器. 客户端在接收图像的时候, 也会下载以前的旋转和反转参数, 然后客户端根据 ...

  8. spring快速入门(三)

    一.在spring快速入门(二)的基础上,原先我们是采用构造方法完成对象的注入.这里还有其他的方法可以完成注入,通过set方法来完成. 修改UserActionImpl package com.mur ...

  9. WebDriver--操控浏览器

    前一篇讲述了元素的定位方法,现在开始练习如何写自动化测试脚本 我使用的编辑工具是PyCharm,今后该博客中所写的有关Python脚本,都是在该工具中编写的. WebDriver提供了控制浏览器大小. ...

  10. SQL Server 跨网段(跨机房)复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...