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设置从什么位置开始读写。