文件 I/O 和序列化
文件I/O
C#提供了多种方式来读写文件,主要通过System.IO
命名空间中的类来实现,下方会列一些常用的类型:
-
StreamReader/StreamWriter:用于以字符为单位读取或写入文本文件。
-
BinaryReader/BinaryWriter:用于以二进制格式读取或写入基本数据类型。
-
FileStream:提供对文件的基本读写操作,并支持随机访问文件。
-
File 和 Directory 类:提供了一组静态方法,用于创建、复制、删除、移动文件和目录,以及检查文件和目录是否存在等。
使用StreamReader和StreamWriter
using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 写入文本到文件using (StreamWriter writer = new StreamWriter(path)){writer.WriteLine("Hello, world!");}// 从文件读取文本using (StreamReader reader = new StreamReader(path)){string content = reader.ReadToEnd();Console.WriteLine(content);}}
}
使用BinaryReader和BinaryWriter
using System;
using System.IO;class Program
{static void Main(){string path = "example.dat";// 创建或覆盖文件,并准备写入using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create))){writer.Write(123); // 写入整数writer.Write(3.14f); // 写入单精度浮点数writer.Write("Hello, World!"); // 写入字符串}Console.WriteLine("Data written to file.");}
}
using System;
using System.IO;class Program
{static void Main(){string path = "example.dat";// 打开文件进行读取using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))){int intValue = reader.ReadInt32(); // 读取整数float floatValue = reader.ReadSingle(); // 读取单精度浮点数string stringValue = reader.ReadString(); // 读取字符串Console.WriteLine($"Integer Value: {intValue}");Console.WriteLine($"Float Value: {floatValue}");Console.WriteLine($"String Value: {stringValue}");}}
}
注意事项
-
顺序:当你使用
BinaryWriter
写入数据时,必须记住写入数据的顺序,因为在使用BinaryReader
读取数据时,你也需要按照相同的顺序来读取这些数据。 -
编码:默认情况下,
BinaryWriter
使用 UTF-8 编码写入字符串。如果你需要不同的编码,可以在创建BinaryWriter
实例时指定编码方式。 -
异常处理:在实际应用中,你应该添加适当的错误处理代码(如 try-catch 块),以便处理可能发生的 I/O 错误或其他异常情况。
通过 BinaryReader
和 BinaryWriter
,你可以高效地对基本数据类型进行二进制格式的读写操作,这对于处理大量数据或者需要精确控制数据存储格式的情况特别有用。然而,请注意,对于复杂的对象序列化,你可能需要考虑其他方法,比如 XML 或 JSON 序列化。
使用FileStream
创建和写入文件
using System;
using System.IO;
using System.Text;class Program
{static void Main(){string path = "example.txt";string content = "Hello, World!";// 使用 FileStream 创建或覆盖文件,并准备写入using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)){byte[] info = new UTF8Encoding(true).GetBytes(content);// 将字节数组写入文件fs.Write(info, 0, info.Length);}Console.WriteLine("Data written to file.");}
}
读取文件
using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 使用 FileStream 打开文件进行读取using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)){byte[] b = new byte[1024];UTF8Encoding temp = new UTF8Encoding(true);// 循环读取文件中的所有数据while (fs.Read(b, 0, b.Length) > 0){Console.WriteLine(temp.GetString(b));}}}
}
使用File 和 Directory 类
常用的 File
方法包括:
-
Create
: 创建或覆盖指定路径上的文件。 -
Copy
: 将现有文件复制到新位置,可以选择是否覆盖目标位置的现有文件。 -
Delete
: 删除指定的文件。 -
Exists
: 判断指定的文件是否存在。 -
Move
: 移动指定的文件到新位置。 -
ReadAllBytes
,ReadAllLines
,ReadAllText
: 读取文件的内容为字节数组、字符串数组或单个字符串。 -
WriteAllBytes
,WriteAllLines
,WriteAllText
: 将字节数组、字符串数组或单个字符串写入文件。
string sourceFile = @"C:\source\example.txt";
string destFile = @"D:\destination\example.txt";if (!File.Exists(destFile))
{File.Copy(sourceFile, destFile, true);
}
常用的 Directory
方法包括:
-
CreateDirectory
: 创建指定路径中的所有目录和子目录。 -
Delete
: 删除指定的目录及其内容。 -
Exists
: 判断指定的目录是否存在。 -
GetDirectories
: 获取指定目录中的子目录名称。 -
GetFiles
: 获取指定目录中的文件名称。 -
Move
: 将指定的目录及其内容移动到新位置。 -
EnumerateDirectories
,EnumerateFiles
: 遍历目录或文件集合,支持延迟执行。
string newDirPath = @"C:\newfolder";if (!Directory.Exists(newDirPath))
{Directory.CreateDirectory(newDirPath);
}
File 和 Directory注意事项:
当使用 File
或 Directory
类的静态方法可能更方便。但是,如果计划多次重用某个对象,考虑使用 FileInfo
或 DirectoryInfo
类的实例方法,因为这可以避免重复的安全检查并可能提高性能。
请注意,尽管 BinaryFormatter
曾经是一个流行的序列化工具,但出于安全性和兼容性的考虑,在新的开发工作中应避免使用它,而转向其他更安全的替代方案,如 JSON 序列化。不过,这一建议与 File
和 Directory
类的主要用途并不直接相关,这里只是作为补充信息提供。
相关文章:
文件 I/O 和序列化
文件I/O C#提供了多种方式来读写文件,主要通过System.IO命名空间中的类来实现,下方会列一些常用的类型: StreamReader/StreamWriter:用于以字符为单位读取或写入文本文件。 BinaryReader/BinaryWriter:用于以二进制格…...

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解
欢迎来到我的主页:【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库,提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上,支持…...

HELLOCTF反序列化靶场全解
level 2 <?php/* --- HelloCTF - 反序列化靶场 关卡 2 : 类值的传递 --- HINT:尝试将flag传递出来~# -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-07-01 20:30 # Repo: github.com/ProbiusOfficial/PHPSerialize-labs # email: adminhello-ctf.com…...

十二、Docker Compose 部署 SpringCloudAlibaba 微服务
一、部署基础服务 0、项目部署结构 项目目录结构如下: /home/zhzl_hebei/ ├── docker-compose.yml └── geochance-auth/└── Dockerfile└── geochance-auth.jar └── geochance-system/└── Dockerfile└── geochance-system.jar └── geochance-gateway/…...
VUE之插槽
1、默认插槽 <template><div class"father"></div><h3>父组件</h3><div class"content"><Category title"热门游戏列表"><ul><li v-for"g in games" :key"g.id">{{…...
4. Go结构体使用
1、结构体的简介 结构体(Struct)是编程语言中常见的一种复合数据类型,它将不同类型的数据元素(成员)组合成一个单一的实体。通过结构体,程序员可以将具有不同类型和性质的信息绑定到一个对象中,…...
版本控制的重要性及 Git 入门
版本控制:软件开发的基石 在软件开发的浩瀚宇宙中,版本控制无疑是那颗最为闪耀的恒星,照亮了整个开发过程,成为现代软件开发不可或缺的基石。 历史追溯,定位问题根源 版本控制就像是一位不知疲倦的史官,…...

[NKU]C++安装环境 VScode
bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂!!大学生及初学初学C/C进!!!_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 2安装插件 2.1 C/C 2.2 C/C Compile run 2.3 better C Syntax 查看已…...

deepseek本地部署
DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…...

网络编程day1
实例: struct sockaddr_in addr {0};//初始化 addr.sin_family AF_INET;//设置地址族 addr.sin_port htons(8888);//设置端口号 addr.sin_addr.s_addr inet_addr("192.168.1.1"); //设置ip地址 bind(sock,(struct sockaddr *)&addr,sizeof(ad…...
QFileDialog::getOpenFileName(this,“文件对话框“,“.“,“c++ files(*.cpp);;“); 文件对话框显示乱码
在使用 QFileDialog::getOpenFileName 时,如果文件对话框显示乱码,通常是因为编码问题。Qt 默认使用 UTF-8 编码,但如果你的系统或源代码文件的编码不一致,可能会导致乱码。 以下是几种可能的解决方法: 1. 确保源代码…...

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程
文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后,使用一行代码快速安装cpolar内网穿透工具,轻松实现随时随地远程访问本地内网中的绿联NAS,无需公网…...

C++学习——缺省参数、重载函数、引用
目录 前言 一、缺省参数 1.1概念 1.2写法 1.3半缺省 1.4使用 二、重载函数 2.1.概念 2.2类型 2.3参数 2.4顺序 2.5问题 2.6原理 三、引用 1、引用是什么? 2、引用的使用方法 3、引用特性 1、引用在定义的时候必须要初始化 2、一个变量会有多个引用…...

web-JSON Web Token-CTFHub
前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…...
langchain教程-11.RAG管道/多轮对话RAG
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

Postgresql的三种备份方式_postgresql备份
这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。它会产生一个脚本文件,里面包含备份开始时,已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…...
WebAssembly:前后端开发的未来利器
引言 在互联网的世界里,前端和后端开发一直是两块重要的领域。而 JavaScript 长期以来是前端的霸主,后端则有各种语言诸如 Java、Python、Node.js、Go 等等。然而,近年来一个名为 WebAssembly (Wasm) 的技术正在逐渐改变这一格局。它的高性能…...

Mac下使用brew安装go 以及遇到的问题
首先按照网上找到的命令进行安装 brew install go 打开终端输入go version,查看安装的go版本 go version 配置环境变量 查看go的环境变量配置: go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录,在该目录中新建…...
【Leetcode 每日一题】47. 全排列 II
问题背景 给定一个可包含重复数字的序列 n u m s nums nums,按任意顺序 返回所有不重复的全排列。 数据约束 1 ≤ n u m s . l e n g t h ≤ 8 1 \le nums.length \le 8 1≤nums.length≤8 − 10 ≤ n u m s [ i ] ≤ 10 -10 \le nums[i] \le 10 −10≤nums[i]≤…...

车型检测7种YOLOV8
车型检测7种YOLOV8,采用YOLOV8NANO训练,得到PT模型,转换成ONNX,然后OPENCV的DNN调用,支持C,python,android开发 车型检测7种YOLOV8...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 允许出现允许…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...