深入理解C#中的IO操作 - FileStream流详解与示例

news2024/11/17 6:19:18

文章目录

  • 一、FileStream类的介绍
  • 二、文件读取和写入
    • 2.1 文件读取(FileStream.Read)
    • 2.2 文件写入(FileStream.Write)
  • 三、文件复制、移动和目录操作
    • 3.1 文件复制(FileStream.Copy)
    • 3.2 文件移动(FileStream.Move)
    • 3.3 目录操作
  • 四、FileStream类的性能特点
  • 五、在WPF和ASP.NET中的应用
    • ASP.NET用于处理上传和下载文件示例
    • FileStream类的使用示例
  • 六、总结


在这里插入图片描述

在C#编程中,文件操作是不可或缺的一部分。C#提供了丰富的类库来方便地进行文件的读取、写入、复制、移动以及目录操作等操作。其中,FileStream类是进行文件操作的重要类之一。本文将深入分析FileStream类的功能、用法以及在文件读取、写入、复制、移动以及目录操作等操作中的应用示例,帮助读者全面理解FileStream类的应用价值。

一、FileStream类的介绍

FileStream类是System.IO命名空间中的一个抽象类,它提供了对文件的读取和写入操作。FileStream类不能直接实例化,但可以通过其派生类进行文件操作,如FileStream、BufferedStream等。FileStream类的主要功能包括文件读取、文件写入、文件复制、文件移动以及目录操作等。

二、文件读取和写入

FileStream类提供了两个重要的方法来进行文件的读取和写入操作:Read方法和Write方法。

2.1 文件读取(FileStream.Read)

Read方法从文件中读取字节数据,将其存储在byte数组中。方法原型如下:

public int Read(byte[] buffer, int offset, int count)

参数buffer表示存放读取数据的数组,offset表示数组的偏移量,count表示要读取的字节数。

示例代码:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        using (FileStream readStream = new FileStream("example.txt", FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = readStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));
            }
        }
    }
}

2.2 文件写入(FileStream.Write)

Write方法将字节数据写入文件。方法原型如下:

public void Write(byte[] buffer, int offset, int count)

参数buffer表示要写入的byte数组,offset表示数组的偏移量,count表示要写入的字节数。

示例代码:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        using (FileStream writeStream = new FileStream("example.txt", FileMode.OpenOrCreate, FileAccess.Write))
        {
            byte[] buffer = new byte[1024];
            string text = "Hello, World!";
            byte[] textBytes = Encoding.ASCII.GetBytes(text);
            writeStream.Write(textBytes, 0, textBytes.Length);
        }
    }
}

三、文件复制、移动和目录操作

FileStream类还提供了一些方法来进行文件的复制和移动操作,以及创建和获取目录信息。

3.1 文件复制(FileStream.Copy)

Copy方法用于复制文件。方法原型如下:

public static long Copy(string sourceFileName, string destinationFileName, int bufferSize)

参数sourceFileName表示源文件的名称,destinationFileName表示目标文件的名称,bufferSize表示缓冲区大小。

示例代码:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string sourceFile = "example.txt";
        string destinationFile = "example_copy.txt";
        File.Copy(sourceFile, destinationFile, 1024);
    }
}

3.2 文件移动(FileStream.Move)

Move方法用于移动文件。方法原型如下:

public static void Move(string sourceFileName, string destinationFileName)

参数sourceFileName表示源文件的名称,destinationFileName表示目标文件的名称。

示例代码:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string sourceFile = "example.txt";
        string destinationFile = "example_moved.txt";
        File.Move(sourceFile, destinationFile);
    }
}

3.3 目录操作

FileStream类本身不直接提供目录操作的功能,但是可以通过Directory类来进行目录的创建、获取最后写入时间等操作。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        // 创建目录
        string directoryPath = "example_directory";
        Directory.CreateDirectory(directoryPath);

        // 获取目录的最后写入时间
        DateTime lastWriteTime = Directory.GetLastWriteTime(directoryPath);
        Console.WriteLine($"The last write time of the directory is: {lastWriteTime}");
    }
}

四、FileStream类的性能特点

FileStream类是用于文件I/O操作的低级别流,它提供了对文件的直接访问,但并不提供高级的缓存机制。因此,它的读取速度和写入能力取决于底层的文件系统和硬件。在多核处理器系统上,FileStream类的并行性能主要受限于操作系统对文件的锁定机制。

FileStream类在进行文件操作时,会占用一定的内存资源,因为它需要维护内部的状态信息,如文件位置、缓存等。在大规模文件操作中,FileStream类的性能可能会受到影响,此时可以考虑使用更高层次的抽象,如StreamReader、StreamWriter、BinaryReader、BinaryWriter等,它们通常提供更好的性能和更简单的使用方式。

五、在WPF和ASP.NET中的应用

在WPF中,FileStream类可以用于读取或写入本地文件系统中的文件。例如,可以创建一个FileStream来读取用户的文档或图片,或者将应用程序的配置文件写入文件系统。

ASP.NET用于处理上传和下载文件示例

在ASP.NET中,FileStream类可以用于处理上传和下载文件。例如,可以使用FileStream来读取用户上传的文件,或者将文件写入服务器上的目录以供下载。

// ASP.NET中上传文件示例
public void UploadFile(HttpPostedFileBase file)
{
    string filePath = "C:\\path\\to\\upload\\" + file.FileName;
    using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
    {
        file.InputStream.CopyTo(fileStream);
    }
}

// ASP.NET中下载文件示例
public void DownloadFile(string filePath)
{
    using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
    {
        // 创建一个MemoryStream来复制文件内容
        MemoryStream memoryStream = new MemoryStream();
        fileStream.CopyTo(memoryStream);
        memoryStream.WriteTo(Response.OutputStream);
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filePath));
        memoryStream.Close();
    }
}

FileStream类的使用示例

以下是一个简单的示例,展示了如何使用FileStream类进行文件的读取和写入操作:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        // 创建一个FileStream对象,用于读取文件
        using (FileStream readStream = new FileStream("example.txt", FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = readStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));
            }
        }

        // 创建一个FileStream对象,用于写入文件
        using (FileStream writeStream = new FileStream("example.txt", FileMode.OpenOrCreate, FileAccess.Write))
        {
            byte[] buffer = new byte[1024];
            string text = "Hello, World!";
            byte[] textBytes = Encoding.ASCII.GetBytes(text);
            writeStream.Write(textBytes, 0, textBytes.Length);
        }
    }
}

在这个示例中,我们首先创建了一个FileStream对象用于读取文件,然后创建了一个FileStream对象用于写入文件。这两个操作分别使用了一个byte数组来存储读取和写入的数据。

六、总结

FileStream类是C#中进行文件I/O操作的重要类之一。通过本文的分析,我们了解了FileStream类的功能、用法以及在文件读取、写入、复制、移动以及目录操作等操作中的应用示例。FileStream类的性能特点以及在WPF和ASP.NET中的应用也得到了讨论。希望这些信息能够帮助读者更好地理解和运用FileStream类,提高编程效率和解决实际问题的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1684296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware ESXI 7.0安装部署

1、为什么要虚拟化? 目前,物理服务器存在以下几个问题: 1)硬件资源利用率低; 2)可靠性不足,物理服务器宕机即可造成整体业务停摆; 3)维护量大,无法实现统…

H5228 6.5-75V60V48V36V24V12V 升降压芯片LED恒流驱动IC 支持无频闪数转模调光

H5228 是款调光特性良好的宽范围调光比且无频闪调光的 LED 恒流驱动器。支持降压、 升压和升降压拓扑的应用,具有 6.5~75V 宽输入工作电压范围,采用连续电流模式(CCM) 为高亮度 LED 供电。调光深度可调很低,在低亮负…

计算机缺失ffmpeg.dll如何修复,五种详细的修复教程分享

当你在使用电脑过程中,突然遇到系统或软件弹出提示信息,告知“ffmpeg.dll文件丢失”怎么办?当电脑提示ffmpeg.dll丢失时,可能会导致一些应用程序无法正常运行或出现错误提示。下面我将介绍5种解决电脑提示ffmpeg.dll丢失的方法。 …

【Linux】:进程切换

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux进程切换的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精…

全面了解CC攻击和防范策略

前言 “ CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。” 什么是CC攻击? CC攻击前身是一个名为Fatboy的攻击程序,而之所以后来人们会称之为CC,也叫HTTP-FLOOD&#xff…

浅谈面向对象--多态

接口 接口概述 我们要完成一个工程,需要一个插座 思考1:去市场买个回来!> 市场上有公牛、小米... > 小米和公牛认识吗?什么原因导致公牛和小米的插座我都可以用 接口是一种约定的规范,是多个抽象方法的集合&…

基于网络爬虫技术的网络新闻分析(四)

目录 4.2 系统异常处理 4.2.1 爬虫异常总体概况 4.2.2 爬虫访问网页被拒绝 5 软件测试 5.1 白盒测试 5.1.1 爬虫系统测试结果 5.1.2 中文分词系统测试结果 5.1.3 中文文章相似度匹配系统测试结果 5.1.4 相似新闻趋势展示系统测试结果 5.2 黑盒测试 5.2.1 爬虫系统测…

【每日刷题】Day47

【每日刷题】Day47 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 112. 路径总和 - 力扣(LeetCode) 2. 2404. 出现最频繁的偶数元素 - 力扣&am…

PPT图片高清导出

PPT制作的图片高清导出 适用于windows系统 案例 例如想要导出下面这张图片 1. 保存为emf文件 2. 将emf文件导入画图软件 导入方法直接将emf文件拖进去就行,可以看到图片成功高清显示(可以通过放缩检查是否模糊)。 3. 修改分辨率 点击上方…

Redis协议的请求和响应有哪些“套路”可循?no.18

Redis 协议 Redis 支持 8 种核心数据结构,每种数据结构都有一系列的操作指令,除此之外,Redis 还有事务、集群、发布订阅、脚本等一系列相关的指令。为了方便以一种统一的风格和原则来设计和使用这些指令,Redis 设计了 RESP&#…

适用于Windows 电脑的最佳视频恢复软件和方法

毫无疑问,丢失您的基本数据总是有压力的,尤其是当这些是您为捕捉最美好回忆而收集的重要视频文件时。要恢复丢失或损坏的视频文件,您可以借助视频恢复工具。但是,在选择最佳视频恢复工具时,您必须考虑多个扫描选项&…

Linux .eh_frame section以及libunwind

文章目录 前言一、LSB二、The .eh_frame section2.1 简介2.2 The Common Information Entry Format2.1.1 Augmentation String Format 2.3 The Frame Description Entry Format 三、The .eh_frame_hdr section四、libunwind五、基于Frame Pointer和基于unwind 形式的栈回溯比较…

紫光展锐突破创新终端品类,搭载展锐芯的全球首款二合一5G云电脑正式发布

近日,搭载紫光展锐5G芯片T760的中兴云电脑逍遥系列正式发布,亮点: 全球首款二合一5G云电脑,支持本地/云端双模式,一键切换,用户可同时享有Android平板和Windows云电脑两种形态;支持5G蜂窝网络&…

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档:Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务,复…

DeepDriving | CUDA编程-02: 初识CUDA编程

本文来源公众号“DeepDriving”,仅用于学术分享,侵权删,干货满满。 原文链接:CUDA编程-02: 初识CUDA编程 上一篇文章DeepDriving | CUDA编程-01: 搭建CUDA编程环境-CSDN博客介绍了如何搭建CUDA编程环境&a…

阿里云数据库 SelectDB 版全面商业化,开启现代化实时数据仓库的全新篇章

2024 年 5 月 21 日,由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布,阿里云数据库 SelectDB 版在中国站及国际站全面发布,正式开启商…

5. JVM面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 说一下JVM的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Cl…

Kibanna安装配置

环境:windows10、ES(8.13.3)、Kibana(8.13.3)、Logstash(8.13.3) 1.Kibanna安装配置 Kibanna对ES的数据进行可视化、分析和监控 Download Kibana Free | Get Started Now | ElasticDownload K…

零部件销售|基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现(源码+数据库+文档)

轻型卡车零部件销售平台 目录 基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

MavLinK协议

由于在公司需要使用这个,我就写一个文章用于入门级别 简单介绍 MAVSDK是PX4开源团队贡献的基于mavlink通信协议的用于无人机应用开发的SDK,其可以部署在Windows、Linux、Android等多种平台,并且支持多种语言如c/c、python、Java等。 在官网…