public static bool ExtractArchiveToMemory(string cassetteName, string inArchivePath, string archivePath, string archiveName) { archivePath += archiveName + ".sarc"; if (!File.Exists(archivePath)) { LOG.WriteLine("не найден файл " + archivePath); return(false); } if (reCache || CacheInArchives.Count > 100000) { // lock (CacheTables) CacheInArchives.Clear(); // lock (CachedArchives) CachedArchives.Clear(); } using (Stream read = File.Open(archivePath, FileMode.Open)) try { var tableLengthBytes = new byte[MaxTableLengthLength]; read.Read(tableLengthBytes, 0, tableLengthBytes.Length); var tableLengthString = TableLengthEncoding.GetString(tableLengthBytes); int tableLength; if (!int.TryParse(tableLengthString, out tableLength)) { LOG.WriteLine(tableLength + " is Not Long in " + archivePath); return(false); } var tableBytes = new byte[tableLength]; read.Read(tableBytes, 0, tableLength); var xTable = XElement.Parse(TableEncoding.GetString(tableBytes)); foreach (var i in xTable.Elements().ToDictionary( //AsParallel() x => cassetteName + "/" + archiveName + "/" + x.Element("path").Value, x => { long newVal1 = -1, newVal2 = -1; if (x.Element("start") == null || !long.TryParse(x.Element("start").Value, out newVal1) || x.Element("length") == null || !long.TryParse(x.Element("length").Value, out newVal2)) { LOG.WriteLine("can't parse " + x.ToString() + " to long in " + archivePath); } return(new KeyValuePair <long, long>(newVal1, newVal2)); })) { CacheInArchives.Add(i.Key, i.Value); } return(true); } catch { return(false); } }
public static void Create(this string path, Dictionary <string, string> filesAndDirsRelativePaths) { //var fileTable=new StreamWriter(path+".txt"); var filesRelativePaths = AddFolderSubfiles(filesAndDirsRelativePaths.ToDictionary(i => i.Key, i => i.Value)); using (var fileAllOrigin = new MemoryStream()) using (var fileAll = File.Create(path)) { var startFileTable = new Dictionary <string, long>(); var endFileTable = new Dictionary <string, long>(); foreach (var file in filesRelativePaths) { using (var fileStream = File.OpenRead(file.Key)) { startFileTable.Add(file.Value, fileAllOrigin.Length); endFileTable.Add(file.Value, fileStream.Length); var bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileAllOrigin.Write(bytes, 0, bytes.Length); } } var xTable = new XElement("table", new XAttribute("version", "25.05.2012"), endFileTable.Select(i => new XElement("file", new XElement("path", i.Key), new XElement("start", startFileTable[i.Key]), new XElement("length", i.Value)))); var tableBytes = TableEncoding.GetBytes(xTable.ToString()); var tableLengthbytes = TableLengthEncoding.GetBytes(tableBytes.Length.ToString()); //int MaxTableLengthLength = 13; if (tableLengthbytes.Length > MaxTableLengthLength) { LOG.WriteLine("Длина " + tableBytes.Length + tableLengthbytes.Length + " таблицы архива больше 10тб"); return; } var fullTableLengthBytes = new byte[MaxTableLengthLength]; for (int i = 0; i < tableLengthbytes.Length; i++) { fullTableLengthBytes[i] = tableLengthbytes[i]; } fileAll.Write(fullTableLengthBytes, 0, MaxTableLengthLength); fileAll.Write(tableBytes, 0, tableBytes.Length); fileAllOrigin.Seek(0, SeekOrigin.Begin); fileAllOrigin.WriteTo(fileAll); //foreach(var item in filesAndDirsRelativePaths) // ClearDirOrFile(item.Key); } }