网站模块在线制作教程,前端设计除了做网站还能做什么,绵阳市公司网站建设,通过网站赚钱FileStream
FileStream 是 .NET 中用于文件操作的重要类#xff0c;位于 System.IO 命名空间中。它提供了对文件的同步和异步读写操作。以下是它的方法签名和重载的详细介绍#xff1a; 构造函数签名和重载
FileStream 提供多个构造函数#xff0c;允许在创建实例时指定文…
FileStream
FileStream 是 .NET 中用于文件操作的重要类位于 System.IO 命名空间中。它提供了对文件的同步和异步读写操作。以下是它的方法签名和重载的详细介绍 构造函数签名和重载
FileStream 提供多个构造函数允许在创建实例时指定文件路径、文件模式、访问权限、共享方式等。
常见构造函数
// 基本构造函数
FileStream(string path, FileMode mode);// 支持指定访问权限和共享方式
FileStream(string path, FileMode mode, FileAccess access);// 支持更多高级选项如缓冲区大小和文件选项
FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options);示例
using System.IO;// 只读方式打开文件
FileStream fs1 new FileStream(example.txt, FileMode.Open, FileAccess.Read);// 读写模式打开文件并允许其他进程共享读取
FileStream fs2 new FileStream(example.txt, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);// 指定缓冲区大小和异步操作
FileStream fs3 new FileStream(example.txt, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.Asynchronous);内置的主要方法
public override int Read(byte[] array, int offset, int count);
public override void Write(byte[] array, int offset, int count);
public override long Seek(long offset, SeekOrigin origin);
public override void Flush();
public override Taskint ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken default);
public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken default);
public override void Close();
protected override void Dispose(bool disposing);
public override void SetLength(long value);
long fileLength fs.Length;
fs.Position 0; // 设置流的位置到开头FileStream 中数据写入文件的方向和位置是由 Position 属性和 Seek 方法控制的
默认情况下FileStream 在打开时会将文件指针定位到文件的开头除非你指定了其他模式如追加模式
Position 属性表示文件流中的当前字节位置字节是最底层单位即下一个要写入或读取的字节位置
可以直接修改 Position 属性来改变写入数据的起始位置 不同于字符串的HELLOaaca每个字符是多字节转化后的高级对象
Position的最底层一个字节一个字节的读
byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7 .... FileMode.Create创建新文件如果文件已存在覆盖文件。FileMode.Append将写入数据追加到文件的末尾即使你改变了 Position数据也会追加到文件末尾。FileMode.OpenOrCreate打开文件如果文件不存在则创建新文件。FileMode.Open打开文件要求文件存在。 fs 的 Write 和 Read 方法是相对于 fs 自身的当前位置进行操作的(Position 属性)
FileStream 对象有一个 Position 属性它表示流中的当前字节位置。每次读取或写入数据时都是从这个位置开始的。Position 会在读写操作后自动更新。
写入 (Write)写入数据时数据会从当前位置开始覆盖当前位置开始的字节。如果 Position 指向文件的末尾则数据会追加到文件末尾。
读取 (Read)读取数据时数据会从当前位置开始读取的字节数由参数指定。读取后Position 会自动移动到读取数据后的下一个位置。 走一遍流程1 有了表的每一列的对应数据结构类
也有了装这些单个数据结构类的字典类
之后
生成二进制文件了 先确认存储的位置为streamingAssets
StreamingAssets 文件夹在 Unity 中是一个特殊的目录主要用于存放游戏中的静态文件如配置文件、音视频资源等
与 Unity 的 Resources 不同StreamingAssets 中的文件不会被 Unity 的资源打包工具压缩或转换而是以原始格式保留。
不论是 PC、移动端iOS/Android还是 WebGLStreamingAssets 的文件都被保留并打包到特定的路径中能够直接访问。 安全检查文件夹的存在情况 文件流是贴在具体的文件上的
关于byte
“位”bit是现代计算机存储和处理信息的最小单位。比“位”更底层的概念主要涉及到物理实现和理论基础所以要对计算机的深度在软件层面上位已经是绝对终点了
byte是八个位通过一定的规则构成的一个对象也就是说byte就是次绝对终点而byte可以涵盖的数据范围更广所以会更容易在网络通信和其他数据传输中发挥最底层的运输单元
不用担心会时不时把byte又拆成分散的位去操作什么的从宏观角度来讲这种操作的出现可能无限接近0
基本数据类型的重新表述
字节为数据基本单位
int 是一种4 字节单位信息量 封装成的 数据类型。
byte 是 8 位无符号整数
byte所含信息量 可以表示一个 ASCII 范围 0-127
字符占用的字节数
不同编码方式下字符可能占用不同数量的 byte ASCII 编码1 个字符占用 1 个 byte。UTF-8 编码普通英文字母占用 1 个 byte中文字符可能占用 3 个 byte。UTF-16 编码大多数字符占用 2 个 byte。
BitConverter
BitConverter 是 C# 中的一个静态类位于命名空间 System 下用于在基础数据类型和字节数组之间进行转换。它特别适用于二进制序列化和反序列化的场景。
将数值类型如 int, double, float, long转换为字节数组。
BitConverter 仅支持基础数值类型如 int, float, double, bool 等不支持自定义复杂对象的直接转换。
BitConverter.GetBytes() 方法 使用 BitConverter.GetBytes() 方法将基本数据类型转换为字节数组。
只能接收一个参数不支持同时传入多个参数也不能直接处理数组或复杂对象
// 方法所在命名空间
namespace System
{public static class BitConverter{public static byte[] GetBytes(bool value);public static byte[] GetBytes(char value);public static byte[] GetBytes(double value);public static byte[] GetBytes(short value);public static byte[] GetBytes(int value);public static byte[] GetBytes(long value);public static byte[] GetBytes(float value);public static byte[] GetBytes(ushort value);public static byte[] GetBytes(uint value);public static byte[] GetBytes(ulong value);}
}BitConverter.To 系列方法tostring不算
使用 BitConverter.ToInt32(), BitConverter.ToDouble() 等方法将字节数组转换回基本数据类型注意这里不包含字符串。
namespace System
{public static class BitConverter{public static bool ToBoolean(byte[] value, int startIndex);public static char ToChar(byte[] value, int startIndex);public static double ToDouble(byte[] value, int startIndex);public static short ToInt16(byte[] value, int startIndex);public static int ToInt32(byte[] value, int startIndex);public static long ToInt64(byte[] value, int startIndex);public static float ToSingle(byte[] value, int startIndex);public static ushort ToUInt16(byte[] value, int startIndex);public static uint ToUInt32(byte[] value, int startIndex);public static ulong ToUInt64(byte[] value, int startIndex);}
}BitConverter.To 系列方法没有重载每种方法都专门用于一种目标数据类型接收相同的两个参数
byte[] value 要解析的字节数组。int startIndex 字节数组中起始解析的位置。
参数要求 字节数组的长度 数组从指定的 startIndex 开始必须至少包含目标类型所需的字节数。例如 ToInt32 需要 4 个字节。ToDouble 需要 8 个字节。否则会抛出 ArgumentOutOfRangeException。 字节序决定了数据的高位字节和低位字节的存储顺序。BitConverter 的默认行为依赖于系统的字节序
小端序 (Little-Endian)低位字节在前高位字节在后。大端序 (Big-Endian)高位字节在前低位字节在后。
如果目标环境可能使用不同的字节序如网络通信或跨平台开发需要手动调整字节顺序。
BitConverter.ToString()
BitConverter.ToString()方法是完全自定化的转字符串方式不是把byte转ASCII码去对应
而是全部转16进制并且用短横线-连接起来最后返回也是有点变态了
不涉及编码翻译编码翻译是通过抓字节然后按字符集的规则翻译成对应的字符仅仅是字节值的格式化输出工具 如果你希望将字节数组翻译成对应的 ASCII 或其他编码的字符应该使用 System.Text.Encoding
byte[] bytes { 72, 101, 108, 108, 111 }; // 字节数组表示 ASCII 字符 Hellostring text System.Text.Encoding.ASCII.GetString(bytes);
Console.WriteLine(text); // 输出 Hellof2变量重命名 默认情况下Directory.GetFiles 不会获取子目录中的文件。它只会返回当前目录中的文件。 Excel源文件-C#中每行的数据 DataTable、DataTableCollection
所属命名空间: System.Data
DataTable核心属性和方法:
Rows访问数据表中的行。Columns访问数据表中的列。AcceptChanges() 和 RejectChanges()管理数据表中的更改。
DataTableCollection核心属性和方法:
Count返回集合中的表数量。Add()向集合中添加一个新的 DataTable。Remove()从集合中移除一个 DataTable。索引器[int index] 或 [string name]通过索引或名称访问指定的 DataTable。 DataTableCollection 是一个 DataSet 中包含的 DataTable 对象的集合通过 DataSet.Tables 属性访问。
当需要操作多个 DataTable 时DataTableCollection 提供一个统一的接口。
每个 DataTable 对象代表一个表格数据。 IExcelDataReader、ExcelReaderFactory
所属命名空间: ExcelDataReaderIExcelDataReader读取 Excel 文件中的数据。 它是一个流式读取器能够高效地从 Excel 文件中读取数据。支持 .xls 和 .xlsx 文件格式。ExcelReaderFactory 是一个工厂类用于创建 IExcelDataReader 的实例
核心方法和功能:
Read()逐行读取数据。GetValue(int columnIndex)获取当前行中指定列的数据。FieldCount 和 Depth提供有关表格结构的元数据。 ExcelReaderFactory初始化 IExcelDataReader 对象
IExcelDataReader直接从 Excel 文件中读取数据通常作为数据源结合 ExcelDataReader 提供的功能将数据转换为其他格式如 DataSet 或 DataTable。 它们的关系和数据流
它们之间的关系可以理解为 Excel 文件到内存中的表格数据的转换过程 ExcelReaderFactory: 创建一个 流式读取 Excel 源文件的IExcelDataReader 实例。 IExcelDataReader: 读取 Excel 文件的内容逐行、逐列读取并将其表示为 DataSet 或 DataTable 格式。 DataSet 和 DataTableCollection: 调用 IExcelDataReader.AsDataSet() 方法时Excel 文件中的整体数据会被转换成一个 DataSet其中每个工作表成为一个 DataTable存储在 DataSet.Tables 中。 DataTable: DataSet.Tables 集合中的单个表的对象类访问具体的工作表数据。 示例代码将 Excel 文件读入 DataTable
以下是它们协同工作的一个典型示例
using System;
using System.Data;
using System.IO;
using ExcelDataReader;class Program
{static void Main(){string filePath C:\example.xlsx;// 打开文件流FileStream stream File.Open(filePath, FileMode.Open, FileAccess.Read);// 创建 IExcelDataReaderIExcelDataReader reader ExcelReaderFactory.CreateReader(stream);// 将 Excel 数据转为 DataSetDataSet dataSet reader.AsDataSet();// 获取所有工作表的集合DataTableCollection tables dataSet.Tables;// 选择第一个工作表DataTable table tables[0];// 输出表格内容foreach (DataRow row in table.Rows){foreach (object cell in row.ItemArray){Console.Write(${cell}\t);}Console.WriteLine();}// 释放资源reader.Close();stream.Close();}
}总结关系
ExcelReaderFactory: 创建用于读取 Excel 源文件的流的读取器IExcelDataReader。IExcelDataReader: 读取器将流读成IO里的 DataSet类对象。DataTableCollection: DataSet 中包含的多个工作表集合。DataTable: 单个工作表对象可以对其进行操作和分析。
excel源文件 v
c#基础流生成 v
流读取DataReader v
DataSet -DataTableCollection -DataTable
这四者形成了从 Excel 文件读取到内存数据结构操作的完整工作流。
是否可以通过 DataSet 修改 Excel 源文件
不能直接通过 DataSet 修改 Excel 文件。以下是原因和工作机制的分析
工作机制 ExcelReaderFactory 和 IExcelDataReader 这些工具主要用于读取 Excel 文件将其内容加载到 DataSet 或 DataTable 中。数据读取是一次性操作将文件中的数据复制到内存中之后的操作仅限于内存数据不会自动同步到原文件。 DataSet 的特性 DataSet 是一个内存中的数据存储结构与数据源如 Excel、数据库等是分离的。在 DataSet 中对数据的修改不会自动反映到原始数据源如 Excel 文件。
Directory.CreateDirectory(path)
用于创建指定路径的目录的方法。它的返回值是一个 DirectoryInfo 对象。 返回值的类型
System.IO.DirectoryInfoDirectoryInfo 是什么
DirectoryInfo 是 .NET 中的一个类用于表示文件系统中的目录。它提供了对目录的一些元信息如名称、路径、父目录等的访问同时提供了操作目录的方法如创建、删除、移动等。 返回的内容
如果目录已存在CreateDirectory 方法不会抛出异常而是返回一个表示该目录的 DirectoryInfo 对象。如果目录不存在会创建该目录及其所有必要的父目录再返回其 DirectoryInfo 对象。 用法示例
using System;
using System.IO;class Program
{static void Main(){string path C:\Example\Subfolder;// 创建目录DirectoryInfo dirInfo Directory.CreateDirectory(path);// 使用返回的 DirectoryInfo 对象Console.WriteLine($Directory created: {dirInfo.FullName});Console.WriteLine($Root: {dirInfo.Root});Console.WriteLine($Parent: {dirInfo.Parent});Console.WriteLine($Name: {dirInfo.Name});}
}关键点
常用属性 FullName: 目录的完整路径。Name: 目录的名称。Parent: 父目录DirectoryInfo 类型。Exists: 检查目录是否存在。常用方法 Create(): 创建目录如果未存在。Delete(): 删除目录。EnumerateFiles(): 列举目录中的文件。EnumerateDirectories(): 列举子目录。 异常处理
在使用 Directory.CreateDirectory 时需要注意以下可能的异常
ArgumentException路径格式无效如包含非法字符。UnauthorizedAccessException无权限创建目录。PathTooLongException路径超出系统支持的最大长度。IOException一般性的 I/O 错误如路径指向一个文件而非目录。 excel的协同开发表的读取是完全可控的
第四行直接跳过需要读取的数据从第五行再开始拿也没问题第四行完全可以作为注释备注给别人看 为Unity编辑器的菜单栏增加新的选项
新的选项绑定在静态方法上
在任意一个自己写的类中写下的静态方法private也可以
静态方法上面加上[MenuItem(选项名的重叠/.../.../)]
选项目录不能只有一级
MenuItem特性可以用在任意类中
为新建目录之后立刻刷新Refresh
Directory.CreateDirectory(....path..);
AssetDatabase.Refresh();
Editor文件夹
Editor文件夹可以放在项目的任何文件夹下可以有多个
放在Editor文件夹下的内容项目打包时不会打包进项目
打包后游戏脚本想要访问Editor中的脚本是访问不了的
异或可以存贮原二进制文件里的所有信息量
概原数据 ^ byte字节的二进制位key 转位数据全信息
异或操作本身具有可逆性并且不会丢失任何信息。
异或和当前key的位同的记为0异的记为1
plus二进制只有0和1
∴达到了信息量的完全保存
异或的所有情况
存贮的原因权重并不是完全在原文件的甚至偏向key的
异或是一个信息联合符号联系左边的数据和右边的数据产生最后的数据
自己给的key是右边的数据原要操作的数据是左边的数据
“产生最后数据”的规则又可以达到让信息具有基于key的特异性 等长性输出的结果长度与输入的二进制文件长度相同信息量保持不变。操作的完备性异或操作既可以编码结合一个密钥也可以解码使用相同的密钥。无信息丢失异或的计算过程是完全可逆的不涉及任何丢弃或压缩信息的操作。 任意的一个key为一个字节每个字节再和199的二进制八位去异或 内存流是先得到字节数组然后可对字节数组进行一下操作再压入流中
文件流则是直接压入流中
Flush和Close 下划线Ctrl U
加粗Ctrl B 斜体Ctrl I
在C#中FileStream的Flush和Close方法的作用和区别如下 1. Flush方法 作用确保所有Write的内容都被保存到目标文件中不停留在内存中的缓冲区。 适用场景 当你需要确保数据被写入到磁盘或目标介质中而流仍然需要继续使用时可以调用Flush。 注意事项 调用Flush不会关闭流也不会释放流的资源。如果只是读取操作调用Flush是无效的因为它主要用于清空写入缓冲区。 示例 using (FileStream fs new FileStream(example.txt, FileMode.Create))
{byte[] data System.Text.Encoding.UTF8.GetBytes(Hello, World!);fs.Write(data, 0, data.Length);fs.Flush(); // 确保数据立即写入文件// 之后可以继续对fs进行写操作
}2. Close方法 作用Close关闭流并释放所有与流相关的系统资源。它还会自动调用Flush来确保缓冲区中的数据被写入到目标存储。 适用场景 当你确定不再需要使用流时应调用Close来释放资源。 注意事项 调用Close后流将无法再次使用任何操作都会引发异常。从.NET Framework 4.5开始推荐使用Dispose通过using语句来代替显式调用Close因为Dispose也会自动调用Close。 示例 FileStream fs new FileStream(example.txt, FileMode.Create);
byte[] data System.Text.Encoding.UTF8.GetBytes(Goodbye, World!);
fs.Write(data, 0, data.Length);
fs.Close(); // 关闭流并释放资源主要区别
方面FlushClose功能清空缓冲区将数据写入存储。关闭流释放资源同时清空缓冲区。后续操作流仍然可用能继续读写操作。流被关闭无法再进行任何操作。是否释放资源不释放资源仅执行写入操作。释放与流相关的所有系统资源。是否调用Flush仅清空缓冲区无需再调用。内部会自动调用Flush。