private static async Task ExtractBarFileContents(BarEntry barFileInfo, string rootPath, FileStream fileStream, string outputPath, bool convertFile) { fileStream.Seek(barFileInfo.Offset, SeekOrigin.Begin); //Seek to file var path = Path.Combine(outputPath, rootPath, Path.GetDirectoryName(barFileInfo.FileName) ?? string.Empty); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var filePath = Path.Combine(outputPath, rootPath, barFileInfo.FileName); //Extract to tmp file var tempFileName = await CreateTempFileForBarFile(fileStream, barFileInfo); await ConvertFile(convertFile, tempFileName, barFileInfo, filePath); }
private static async Task <string> CreateTempFileForBarFile(FileStream fileStream, BarEntry barFileInfo) { var tempFileName = Path.GetTempFileName(); using (var fileStreamFinal = File.Open(tempFileName, FileMode.Create, FileAccess.Write, FileShare.None)) { var buffer = bufferPool.Rent(81920); try { int read; var totalread = 0L; while ((read = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0) { if (read > barFileInfo.FileSize) { totalread = barFileInfo.FileSize; await fileStreamFinal.WriteAsync(buffer, 0, barFileInfo.FileSize); } else if (totalread + read <= barFileInfo.FileSize) { totalread += read; await fileStreamFinal.WriteAsync(buffer, 0, read); } else if (totalread + read > barFileInfo.FileSize) { var leftToRead = barFileInfo.FileSize - totalread; totalread = barFileInfo.FileSize; await fileStreamFinal.WriteAsync(buffer, 0, Convert.ToInt32(leftToRead)); } if (totalread >= barFileInfo.FileSize) { break; } } } finally { bufferPool.Return(buffer); } } return(tempFileName); }
private static async Task ConvertFile(bool convertFile, string tempFileName, BarEntry barFileInfo, string filePath) { //Convert file if (convertFile) { if (L33TZipUtils.IsL33TZipFile(tempFileName) && !barFileInfo.FileName.EndsWith(".age4scn", StringComparison.OrdinalIgnoreCase)) { var rnd = new Random(Guid.NewGuid().GetHashCode()); var tempFileName2 = Path.Combine(Path.GetTempPath(), $"{Path.GetFileName(barFileInfo.FileName)}-{rnd.Next()}.tmp"); await L33TZipUtils.ExtractL33TZipFileAsync(tempFileName, tempFileName2); if (File.Exists(tempFileName)) { File.Delete(tempFileName); } tempFileName = tempFileName2; } if (barFileInfo.FileName.EndsWith(".xmb", StringComparison.OrdinalIgnoreCase)) { try { var rnd = new Random(Guid.NewGuid().GetHashCode()); var tempFileName2 = Path.Combine(Path.GetTempPath(), $"{Path.GetFileName(barFileInfo.FileName)}-{rnd.Next()}.tmp"); XmbFileUtils.XmbToXml(tempFileName, tempFileName2); if (File.Exists(tempFileName)) { File.Delete(tempFileName); } tempFileName = tempFileName2; filePath = filePath.Substring(0, filePath.Length - 4); } catch (Exception) { // } } else if (barFileInfo.FileName.EndsWith(".age4scn", StringComparison.OrdinalIgnoreCase) && !L33TZipUtils.IsL33TZipFile(tempFileName)) { var rnd = new Random(Guid.NewGuid().GetHashCode()); var tempFileName2 = Path.Combine(Path.GetTempPath(), $"{Path.GetFileName(barFileInfo.FileName)}-{rnd.Next()}.tmp"); await L33TZipUtils.CompressFileAsL33TZipAsync(tempFileName, tempFileName2); if (File.Exists(tempFileName)) { File.Delete(tempFileName); } tempFileName = tempFileName2; } } //Move new file if (File.Exists(filePath)) { File.Delete(filePath); } File.Move(tempFileName, filePath); File.SetCreationTimeUtc(filePath, new DateTime(barFileInfo.LastWriteTime.Year, barFileInfo.LastWriteTime.Month, barFileInfo.LastWriteTime.Day, barFileInfo.LastWriteTime.Hour, barFileInfo.LastWriteTime.Minute, barFileInfo.LastWriteTime.Second)); File.SetLastWriteTimeUtc(filePath, new DateTime(barFileInfo.LastWriteTime.Year, barFileInfo.LastWriteTime.Month, barFileInfo.LastWriteTime.Day, barFileInfo.LastWriteTime.Hour, barFileInfo.LastWriteTime.Minute, barFileInfo.LastWriteTime.Second)); }