Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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));
        }