深入理解C#中的IO操作 - FileStream流详解与示例
文章目录
- 一、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类,提高编程效率和解决实际问题的能力。
相关文章:

深入理解C#中的IO操作 - FileStream流详解与示例
文章目录 一、FileStream类的介绍二、文件读取和写入2.1 文件读取(FileStream.Read)2.2 文件写入(FileStream.Write) 三、文件复制、移动和目录操作3.1 文件复制(FileStream.Copy)3.2 文件移动(…...
信息泄露--注意点点
目录 明确目标: 信息泄露: 版本软件 敏感文件 配置错误 url基于文件: url基于路由: 状态码: http头信息泄露 报错信息泄露 页面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判断: 搜索引擎收录泄露 BP: 爆破: 明确目标: 失能 读取 写入 执行 信息泄…...

位运算符
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的,因此,需要先将要执行运算的数据转换为二进制,然后才能进行执行运算。…...

云上聚智——移动云云服务器进行后端的搭建及部署
什么是移动云 移动云是指将移动设备和云计算技术相结合,为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储,而移动云将这些任务转移到云端进行处理。通过移动云,移动设备可以利用云端的高性能计算…...

C语言程序的编译
目录 一、预处理(预编译) 二、编译 三、汇编 四,链接 在前面讲到了宏的定义,那么宏在编译时候是如何发生替换的?接下来做一下详细的介绍C语言程序的编译过程主要包括以下几个步骤:预处理、编译、汇编和…...

滴滴三面 | Go后端研发
狠狠的被鞭打了快两个小时… 注意我写的题解不一定是对的,如果你认为有其他答案欢迎评论区留言 bg:23届 211本 社招 1. 自我介绍 2. 讲一个项目的点,因为用到了中间件平台的数据同步,于是开始鞭打数据同步。。 3. 如果同步的时候…...

深度学习之基于Yolov3的行人重识别
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…...
防火墙最新技术汇总
防火墙技术持续发展,以应对日益复杂的网络安全威胁。以下是防火墙领域的一些最新技术汇总: 下一代防火墙(NGFW):NGFW结合了传统防火墙的分组过滤和状态检测功能,还集成了深度包检测(DPI…...

PikaUnsafe upfileupload
1.client check 客户端检测,前端js检测,禁用js和修改后缀名即可。 php格式不能上传,我们修改后缀上传。 蚁剑成功连接。 2.MIME type 这个就是 content-type 规定上传类型,上面的方法也能成功,也可以修改 conten-ty…...

git拉取项目前需要操作哪些?
1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa:(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase:(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…...

报名开启!2024 开源之夏丨Serverless Devs 课题已上线!
Serverless 是近年来云计算领域热门话题,凭借极致弹性、按量付费、降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域。 Serverless Devs 是一个由阿里巴巴发起的 Serverless 领域的开源项目,其目的是要和开发者们…...

DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)
先上效果: 4个view的文字都是通过DataBinding填充的。交互事件:点击图片,切换图片 创建项目(android Studio 2023.3.1) Build.gradle(:app) 引入依赖库(完整源码) buildFeatures { vie…...
TensorFlow基于anaconda3快速构建
基于python构建太累 Installing Packages - Python Packaging User Guide 使用 pip 安装 TensorFlow 有兴趣自己学,我放弃了 -------------------------------------------------------- 下面基于anaconda 1、下载 Index of /anaconda/archive/ | 清华大学开…...
力扣72-编辑距离
题目链接 记忆化搜索: 解题关键:每次仅考虑两字符串word1、word2分别从0 - i修改成0-j下标的完全匹配(下标表示) 临界条件:当 i 或 j 小于0时,表示该字符串为空,编辑距离确定为 y1 或 x1 int dp[501][501…...
K8S 删除pod的正确步骤
在日常的k8s运维过程中,避免不了会对某些pod进行剔除,那么如何才能正确的剔除不需要的pod呢? 首先,需要查出想要删除的pod # 可通过任意方式进行查询 kubectl get pods -A |grep <podname> kubectl get pods -n <names…...

羊大师分析,羊奶健康生活的营养源泉
羊大师分析,羊奶健康生活的营养源泉 羊奶,作为一种古老的饮品,近年来因其独特的营养价值和健康益处而备受关注。今天,羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…...

刷屏一天GPT-4o,发现GPT4用的都还不熟练?戳这儿
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

力扣HOT100 - 139. 单词拆分
解题思路: 动态规划 class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet new HashSet(wordDict);boolean[] dp new boolean[s.length() 1];dp[0] true;for (int i 1; i < s.length(); i) {…...
rush 功能特性梳理
Rush 可以让 JavaScript 开发者更轻松地同时构建、发布多个 NPM 包,即将多个包或项目放到一个大仓库下管理。 仅需一次 NPM 安装 仅需一步,Rush 便可以将你项目的所有依赖安装到一个公共文件夹下,该文件夹并不像 “package.json” 一样位于项…...

算法分析与设计复习__递归方程与分治
总结自:【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归,递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解; 2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样; 3.存在…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...