我编写了下面的方法,使用二进制模式将文件存档到一个文件中:
// 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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。