创建固定大小的临时文件

本文介绍如何使用C#的FileStream类创建指定大小的临时文件,并填充0x00字节。通过SetLength方法可迅速设定文件大小,适用于初始化大文件等场景。

C#创建固定大小的临时文件,通过FileStream类,执行SetLength方法即可瞬间创建固定大小的文件,文件内容被0x00字节填满。如果是其他语言创建,可以利用Seek定位到给定文件长度的最后一个字节写0x00(记得判断给定文件长度为0的情况)。

演示代码和截图如下:

代码直接用csc.exe命令编译即可。

using System; using System.IO; using System.Linq; class Program { /// <summary> /// 创建固定大小的临时文件 /// </summary> /// <param name="fileName">文件名</param> /// <param name="fileSize">文件大小</param> /// <param name="overwrite">允许覆写:可以覆盖掉已经存在的文件</param> public static void CreateFixedSizeFile(string fileName, long fileSize, bool overwrite) { //验证参数 if (string.IsNullOrEmpty(fileName) || new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }.Contains( fileName[fileName.Length - 1])) throw new ArgumentException("fileName"); if (fileSize < 0) throw new ArgumentException("fileSize"); //创建目录 string dir = Path.GetDirectoryName(fileName); if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) Directory.CreateDirectory(dir); //创建文件 FileMode fileMode = overwrite ? FileMode.Create : FileMode.CreateNew; FileStream fs = null; try { fs = new FileStream(fileName, fileMode, FileAccess.ReadWrite, FileShare.Read); fs.SetLength(fileSize); //设置文件大小 } catch { if (fs != null) { fs.Close(); File.Delete(fileName); //注意,若由fs.SetLength方法产生了异常,同样会执行删除命令,请慎用overwrite:true参数,或者修改删除文件代码。 } throw; } finally { if (fs != null) fs.Close(); } } static void Main() { while (true) { Console.Write("文件名,大小,覆盖:"); var input = Console.ReadLine(); if(input==null) continue; if (input.ToLower() == "exit") break; var sp = input.Split(','); if(sp.Length!=3) continue; try { CreateFixedSizeFile(sp[0],long.Parse(sp[1]),bool.Parse(sp[2])); Console.WriteLine("创建成功:"+sp[0]); } catch (Exception ex) { Console.WriteLine("错误: "+ex.Message); } } } }

在拼接镜像前使用 `dd` 创建固定大小的空白文件,主要是为了**确保每个镜像分区在最终固件文件中占据固定且连续的空间**,这是嵌入式系统中固件布局和烧录的常见做法。以下是详细原因和示例解释: --- ## 🔍 为什么需要固定大小的空白文件? ### 1. **确保镜像布局一致** 嵌入式设备的 Flash 或 eMMC 存储通常有严格的**镜像布局要求**,即每个模块(如 IPL、U-Boot、Logo、内核等)必须位于特定的偏移地址,并且大小固定。 例如: | 模块名 | 偏移地址 | 大小 | 说明 | |----------------|----------|-------|--------------------------| | IPL | 0x000000 | 40KB | 初始程序加载器 | | CIS | 0x00A000 | 24KB | 配置信息存储 | | IPL_CUST | 0x010000 | 24KB | 自定义 IPL 数据 | | U-Boot | 0x018000 | 260KB | 引导程序 | | Logo | 0x05A000 | 32KB | 开机动画图片 | | Recovery Image | 0x062000 | 52KB | 恢复模式界面 | 如果直接使用原始文件拼接,可能会导致偏移地址不一致,破坏固件结构。 --- ### 2. **填充空白区域为 0xFF** Flash 存储(如 NOR Flash)通常默认值为 `0xFF`,某些模块(如 IPL)在烧录前需要保证其区域为全 0xFF,否则可能被误认为是损坏或无效数据。 ```bash dd if=/dev/zero bs=40k count=1 | tr '\000' '\377' > IPL.bin.tmp ``` - `dd if=/dev/zero bs=40k count=1`:创建一个 40KB 的全零文件。 - `tr '\000' '\377'`:将零(0x00)替换为 0xFF,填充空白区域。 这样生成的文件符合 Flash 存储的初始化要求。 --- ### 3. **避免文件大小变化导致偏移错位** 如果你直接使用 `cat` 或 `dd` 拼接原始文件而不预分配大小,那么如果某个模块文件大小发生变化(比如 U-Boot 变大),会导致后续模块的偏移地址错位,从而导致设备无法正常启动。 使用固定大小的 `.tmp` 文件可以确保: - 每个模块始终位于正确的偏移位置。 - 固件结构在不同构建之间保持一致。 --- ### 4. **支持烧录工具的偏移写入** 很多烧录工具(如 `fastboot`、`nandwrite`、`dd`)支持按偏移地址写入文件。例如: ```bash dd if=IPL.bin of=flash.bin bs=40k conv=notrunc seek=0 dd if=U-Boot.bin of=flash.bin bs=260k conv=notrunc seek=1 ``` - `seek=0` 表示从偏移 0 开始写入。 - `bs=40k` 表示每次写入 40KB。 如果镜像文件没有预分配足够的大小,`seek` 操作可能导致写入失败或数据错位。 --- ### ✅ 示例:手动创建一个固件镜像 假设我们要构建一个包含 IPL 和 U-Boot 的镜像: ```bash # 创建 40KB 的 IPL 区域,填充为 0xFF dd if=/dev/zero bs=40k count=1 | tr '\000' '\377' > ipl_partition.tmp dd if=ipl.bin of=ipl_partition.tmp bs=40k count=1 conv=notrunc # 创建 260KB 的 U-Boot 区域 dd if=/dev/zero bs=260k count=1 | tr '\000' '\377' > uboot_partition.tmp dd if=u-boot.bin of=uboot_partition.tmp bs=260k count=1 conv=notrunc # 拼接成完整镜像 cat ipl_partition.tmp uboot_partition.tmp > factory.bin # 清理临时文件 rm -f *.tmp ``` --- ## 🔚 总结 | 原因 | 说明 | |------|------| | **布局一致性** | 确保每个模块位于固定偏移地址 | | **Flash 初始化要求** | 使用 `0xFF` 填充空白区域 | | **防止偏移错位** | 避免模块大小变化影响后续布局 | | **支持偏移烧录** | 便于使用 `dd`、`fastboot` 等工具按偏移写入 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值