C#使用FileStream复制一个任意文件

FileStream,顾名思义,文件流。流,是字节流。我的理解是,硬盘上存在一个字节流,内存里也有一个字节流,它们是对应的。程序运行时,我们只能对内存里的字节流直接操作,在它被关闭的时候,它的内容自动写入硬盘上的相应字节流。
复制一个文件的基本思路是:逐一读取原文件流的字节,逐一写入新文件流中。分别用到文件流的ReadByte()和WriteByte()方法。这里要注意的是,读取时以字节为单位,一个字节如下图所示

是一个0和1组合的序列。ReadByte()读取一个字节后将这个序列求值,返回的是整形数值。如果读到文件的尽头了,不能成功读取字节了,返回的是-1。这个设计是非常合理的。因为只要是个字节,总是能求出它大于或等于0的值的。没有字节了,就返回-1了。这样的话,可以把-1作为循环读取终止的标志。

我下面以一个图片文件的复制为例讲解。

在C盘新建一个画图文件,另存为png格式,文件名pic1。

然后执行以下代码:

using System;
using System.IO;

namespace Demo
{
class Program {
 public static void Main(string[] args)
  {
 FileStream fs1 = new FileStream("c:/pic1.png",FileMode.Open);//FileAccess is dispensable.
   //FileAccess is the extra contract.
 FileStream fs2 = new FileStream("c:/pic2.png",FileMode.Create);
 int d;
 byte b;
 while( ( d = fs1.ReadByte() ) != -1 )
 {
 b = (byte)d;
 fs2.WriteByte( b );
  }
 fs1.Close();
 fs2.Close();
 Console.Write("Press any key to continue . . . ");
 Console.ReadKey(true);
  }
    }
} 

会在c盘下生成一个和pic1一模一样的图片文件pic2.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# FileStream复制大文件

    本文实例为大家分享了C# FileStream复制大文件的具体代码,供大家参考,具体内容如下 即每次复制文件的一小段,以节省总内存开销.当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法. /// <summary> /// 复制文件 /// </summary> /// <param name="fromFile">要复制的文件</param> /// <param name="toFile

  • C# FileStream复制大文件功能

    FileStream缓冲读取和写入可以提高性能.每次复制文件的一小段,以节省总内存开销.当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法. FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在FileHelper中以备不时之需.强制类型转换,如果文件很大,比如4G,就会出现溢出的情况,复制的结果字节丢失严重,导致复制文件和源文件大小不一样.这里修改的代码如下: publ

  • C# FileStream实现大文件复制

    FileStream缓冲读取和写入可以提高性能.FileStream读取文件的时候,是先将流放入内存,经Flush()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在FileHelper中以备不时之需. 参考文章:C# FileStream复制大文件.将该文章中提供的代码稍作修改,原文中进行了强制类型转换,如果文件很大,比如4G,就会出现溢出的情况,复制的结果字节丢失严重,导致复制文件和源文件大小不一样.这里修改的代码如下: public static class

  • C#使用FileStream复制一个任意文件

    FileStream,顾名思义,文件流.流,是字节流.我的理解是,硬盘上存在一个字节流,内存里也有一个字节流,它们是对应的.程序运行时,我们只能对内存里的字节流直接操作,在它被关闭的时候,它的内容自动写入硬盘上的相应字节流. 复制一个文件的基本思路是:逐一读取原文件流的字节,逐一写入新文件流中.分别用到文件流的ReadByte()和WriteByte()方法.这里要注意的是,读取时以字节为单位,一个字节如下图所示 是一个0和1组合的序列.ReadByte()读取一个字节后将这个序列求值,返回的是

  • IIS卸载后重装时提示:安装程序无法复制一个或多个文件 特定错误码是 0xe0000233

    IIS卸载后重装时提示: --------------------------- Windows 安装程序 --------------------------- 安装程序无法复制一个或多个文件.特定错误码是 0xe0000233.按"确定"以继续:或者按"取消",停止安装并且再试一次.如果继续,组件可能无法正常运行. --------------------------- 确定 取消 --------------------------- 网上找的解决办法都是说没

  • java递归实现复制一个文件夹下所有文件功能

    今天开始学习java的IO,学了一个复制文件的例子程序后想自己实现以下如何复制一个文件夹,复制文件的例子程序如下: package io.github.liuzhan214; import java.io.File; import java.io.IOException; public class Main { void solve() { File file = new File("F:\\javaIOTest\\new.txt"); if(!file.exists()) { try

  • C# 复制与删除文件的实现方法

    C# 复制与删除文件的实现方法 1.首先是复制文件 首先打开我们的对话框获得文件路径,当然也可以直接编写路径 private void BtnAddFile_Click(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

  • bat+xcopy实现只复制比目标文件更新的文件

    问题一:假如现在c:\a文件夹下的所有文件和d:\a下的文件相同(修改日期及内容) c:\a下的一个文件被别人修改了或者添加了一个文件! 能否写个bat,判断一下c:\a文件夹下的每个文件的最后修改日期是不是在前两天内!如果是,则复制到d:\a下的相应目录(要是原来有,则覆盖),如果不是,则不复制了. 目录复制: 复制代码 代码如下: @echo off echo y|xcopy c:\a /d /e /r /k d:\a\ pause 复制文件 复制代码 代码如下: echo y | xcop

  • vbs实现只复制比目标文件更新的文件

    因为网站需要频繁的更新首页,有时候使用cdn经常导致首页正在生成内容的时候同步数据(可能是冲突,经常导致首页是空的),这就想了先生成一个不是首页的index2.htm然后再复制一遍为index.htm,这样index2的频繁读写也没问题了.所以先判断index2.htm不是空的时候才复制,而且必须是比index.htm更新的时候才复制.这样就需要一些脚本的支持了. 前几天写了一个(bat+xcopy实现只复制比目标文件更新的文件)还是出现为空的情况,这里特加些功能,参考很多网站的文章,感谢百度的

  • 基于SpringBoot上传任意文件功能的实现

    一.pom文件依赖的添加 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</gr

  • PHP include任意文件或URL介绍

    实践出真理,写一个简单文件PHP文件include一个js文件,执行后没有报错或警告信息,同时看到被包含js的文件的内容被打印出来.因此得出结论:include 目标文件可以是任意类型. 现在再回头看include的官方文档,其中有这么一段话:"当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复.由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中." 注意其中提到"H

  • python实现的一个p2p文件传输实例

    考虑到我手上的服务器逐渐的增多,有时候需要大规模的部署同一个文件,例如因为方便使用systemtap这个工具定位问题,需要把手上几百台服务器同时安装kernel-debuginfo这个包,原有的方式采用一个源服务器,采用rsync或者scp之类的文件传输方式只能做到一个点往下分发这个文件,这个时候下发的速度就会比较的慢,基于以上原因,我写了一个基于bt协议传输文件的小工具,实际测试,传输到10个机房,70多台机器传输一个240M的这个内核文件,到所有的机器,源采用限速2m/s的上传速度,测试的结

随机推荐