Example #1
0
 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);
         }
 }
Example #2
0
        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);
                }
        }