I wrote a method below to archive files into a single file using binary mode:
// 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; } }
I am reading data files using ReadFileData, which is in the method above the method that returns the data string. (StreamReader) Next, I extract my archive. Everything was done perfectly, but the data that will be stored in the extraction method does not give me the correct data, so the extracted files have incorrect data to show their original functionality.
Extraction method:
// Extract archive public void ExtractArchive(string ArchivePath, string ExtractPath, ListView FilesList, Label Status, 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, FileMode.Create), 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; } }
Structure:
struct FileTemplate { public string Name, Path, Data; }
Thanks.
source share