//public FileCabinet(string filename) //{ // ClearFileList(); // Filename = filename; // TempDirectory = ""; //} public void AddFile(string filename) { // try { FileInfo fi = new FileInfo(filename); string filePart; if (filename.ToLower().StartsWith(TempDirectory.ToLower())) { filePart = filename.Substring(TempDirectory.Length); } else { filePart = filename.Substring(filename.LastIndexOf(@"\") + 1); } if (!FileDirectory.ContainsKey(filePart)) { FileEntry fe = new FileEntry(filePart, (int)fi.Length); fe.Offset = currentOffset; FileList.Add(fe); FileDirectory.Add(filePart, fe); currentOffset += fe.Size; } } // catch { } }
public void Extract(bool overwrite, string targetDirectory) { string data; XmlDocument doc = new XmlDocument(); int headerSize = 0; using (FileStream fs = File.OpenRead(Filename)) { byte[] buffer = new byte[256]; fs.Read(buffer, 0, 255); data = Encoding.UTF8.GetString(buffer); int start = data.IndexOf("0x"); if (start == -1) { throw new SystemException(Language.GetLocalizedText(215, "Invalid File Format")); } headerSize = Convert.ToInt32(data.Substring(start, 10), 16); fs.Seek(0, SeekOrigin.Begin); buffer = new byte[headerSize]; fs.Read(buffer, 0, headerSize); data = Encoding.UTF8.GetString(buffer); doc.LoadXml(data); XmlNode cab = doc["FileCabinet"]; XmlNode files = cab["Files"]; int offset = headerSize; FileList.Clear(); foreach (XmlNode child in files.ChildNodes) { FileEntry fe = new FileEntry(child.Attributes["Name"].Value.ToString(), Convert.ToInt32(child.Attributes["Size"].Value)); fe.Offset = offset; offset += fe.Size; FileList.Add(fe); } foreach (FileEntry entry in FileList) { while (entry.Filename.StartsWith("\\")) { entry.Filename = entry.Filename.Substring(1); } string fullPath = TempDirectory + @"\" + entry.Filename; string dir = fullPath.Substring(0, fullPath.LastIndexOf("\\")); string file = fullPath.Substring(fullPath.LastIndexOf("\\")+1); if (!string.IsNullOrEmpty(targetDirectory) && entry.Filename.Contains("\\")) { fullPath = targetDirectory + "\\" + file; dir = targetDirectory; } if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (overwrite || !File.Exists(fullPath)) { FileStream fileOut = new FileStream(fullPath, FileMode.Create); buffer = new byte[entry.Size]; fs.Seek(entry.Offset, SeekOrigin.Begin); if (fs.Read(buffer, 0, entry.Size) != entry.Size) { throw new SystemException(Language.GetLocalizedText(214, "One of the files in the collection is missing, corrupt or inaccessable")); } fileOut.Write(buffer, 0, entry.Size); fileOut.Close(); } } int x = offset; fs.Close(); } }