C#在文件后面追加byte字节

有时候我们想要让某些文件的摘要信息存放在文件尾部,需要时读取出来,不需要时放到最后面,有没有解决方案呢?当然有。

/// <summary>
/// 文件描述
/// </summary>
public class FileDesc
{
    /// <summary>
    /// 原文件名
    /// </summary>
    public string FileName { get; set; }
    /// <summary>
    /// 文件标记
    /// </summary>
    public string FileTag { get; set; }
}

在尾部增加描述并修改文件的格式:

FileDesc fileDesc = new FileDesc()
{
    FileName = fileName,
    FileTag = "duanjt"
};
var str = JsonConvert.SerializeObject(fileDesc);
byte[] firstBytes = Encoding.UTF8.GetBytes(str);
byte[] resultBytes = new byte[1024];
firstBytes.CopyTo(resultBytes, 0);

using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
    using (BinaryWriter bw = new BinaryWriter(fs))
    {
        fs.Seek(fs.Length, SeekOrigin.Begin);  //默认是从0开始的,需要移动位置,否则会覆盖文件原有数据
        bw.Write(resultBytes);
    }
}

string targetFileName = Path.Combine(Path.GetDirectoryName(fileName), times + ".zip");
File.Move(fileName, targetFileName);

AppendMsg(fileName + "==>" + targetFileName);
File.Delete(fileName);

删除尾部的描述信息

FileDesc fileDesc = null;
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
    byte[] headerBytes = new byte[1024];
    if (fs.Length <= headerBytes.Length)
    {
        AppendMsg(fileName + " 不是加密文件");
        continue;
    }
    fs.Seek(fs.Length - headerBytes.Length, SeekOrigin.Begin);
    fs.Read(headerBytes, 0, headerBytes.Length);
    string jsonString = Encoding.UTF8.GetString(headerBytes);
    fileDesc = JsonConvert.DeserializeObject<FileDesc>(jsonString);
    if (fileDesc.FileTag != "duanjt")
    {
        AppendMsg(fileName + " 不是加密文件");
        continue;
    }
    fs.SetLength(fs.Length - headerBytes.Length);
}

string targetFileName = Path.Combine(Path.GetDirectoryName(fileName), fileDesc.FileName);
File.Move(fileName, targetFileName);
AppendMsg(fileName + "==>" + targetFileName);
File.Delete(fileName);

核心思路:FileStream.SetLength直接就截取了前面部分。fs.Seek设置从什么位置开始读写。

posted @ 2023-05-19 22:28  段江涛IT  阅读(399)  评论(0编辑  收藏  举报
页脚HTML代码