加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 读/写字符串二进制数据 – BinaryReader

发布时间:2020-12-15 17:21:54 所属栏目:百科 来源:网络整理
导读:我编写了下面的方法,使用二进制模式将文件存档到一个文件中: // Compile archive public void CompileArchive(string FilePath,ListView FilesList,Label Status,ProgressBar Progress) { FileTemplate TempFile = new FileTemplate(); if (FilesList.Items
我编写了下面的方法,使用二进制模式将文件存档到一个文件中:

// Compile archive
        public void CompileArchive(string FilePath,ListView FilesList,Label Status,ProgressBar Progress)
        {
            FileTemplate TempFile = new FileTemplate();
            if (FilesList.Items.Count > 0)
            {
                BinaryWriter Writer = new BinaryWriter(File.Open(FilePath,FileMode.Create),System.Text.Encoding.ASCII);
                Progress.Maximum = FilesList.Items.Count - 1;
                Writer.Write((long)FilesList.Items.Count);
                for (int i = 0; i <= FilesList.Items.Count - 1; i++)
                {
                    TempFile.Name = FilesList.Items[i].SubItems[1].Text;
                    TempFile.Path = "%ARCHIVE%";
                    TempFile.Data = this.ReadFileData(FilesList.Items[i].SubItems[2].Text + "" + TempFile.Name);
                    Writer.Write(TempFile.Name);
                    Writer.Write(TempFile.Path);
                    Writer.Write(TempFile.Data);
                    Status.Text = "Status: Writing '" + TempFile.Name + "'";
                    Progress.Value = i;
                }
                Writer.Close();
                Status.Text = "Status: None";
                Progress.Value = 0;
            }
        }

我使用ReadFileData读取文件数据,该方法在上面的方法中返回一串数据. (StreamReader)接下来我提取我的档案.一切都做得很好,但是存储在提取方法中的数据并没有给我正确的数据,因此提取的文件没有正确的数据来显示其原始功能.

提取方法:

// Extract archive
    public void ExtractArchive(string ArchivePath,string ExtractPath,ProgressBar Progress)
    {
        FileTemplate TempFile = new FileTemplate();
        BinaryReader Reader = new BinaryReader(File.Open(ArchivePath,FileMode.Open),System.Text.Encoding.ASCII);
        long Count = Reader.ReadInt64();
        if (Count > 0)
        {
            Progress.Maximum = (int)Count - 1;
            FilesList.Items.Clear();
            for (int i = 0; i <= Count - 1; i++)
            {
                TempFile.Name = Reader.ReadString();
                TempFile.Path = Reader.ReadString();
                TempFile.Data = Reader.ReadString();
                Status.Text = "Status: Reading '" + TempFile.Name + "'";
                Progress.Value = i;
                if (!Directory.Exists(ExtractPath))
                {
                    Directory.CreateDirectory(ExtractPath);
                }
                BinaryWriter Writer = new BinaryWriter(File.Open(ExtractPath + "" + TempFile.Name,System.Text.Encoding.ASCII);
                Writer.Write(TempFile.Data);
                Writer.Close();
                string[] ItemArr = new string[] { i.ToString(),TempFile.Name,TempFile.Path };
                ListViewItem ListItem = new ListViewItem(ItemArr);
                FilesList.Items.Add(ListItem);
            }
            Reader.Close();
            Status.Text = "Status: None";
            Progress.Value = 0;
        }
    }

结构:

struct FileTemplate
        {
            public string Name,Path,Data;
        }

谢谢.

解决方法

考虑使用字节数组进行写入并保护数据安全.

字节数组(写)

Byte[] bytes = File.ReadAllBytes(..);
// Write it into your stream
myStream.Write(bytes.Count);
myStream.Write(bytes,bytes.Count);

字节数组(读)

Int32 byteCount = myStream.ReadInt32();
Byte[] bytes = new Byte[byteCount];
myStream.Read(bytes,byteCount);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读