public static async Task CreateGzipAsync(FileSystemStorageFile Source, string NewZipPath, CompressionLevel Level, ProgressChangedEventHandler ProgressHandler = null) { if (Level == CompressionLevel.Undefine) { throw new ArgumentException("Undefine is not allowed in this function", nameof(Level)); } if (await FileSystemStorageItemBase.CreateAsync(NewZipPath, StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream SourceFileStream = await Source.GetFileStreamFromFileAsync(AccessMode.Read)) using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Exclusive)) using (GZipOutputStream GZipStream = new GZipOutputStream(NewFileStream)) { GZipStream.SetLevel((int)Level); GZipStream.IsStreamOwner = false; GZipStream.FileName = Source.Name; await SourceFileStream.CopyToAsync(GZipStream, ProgressHandler : ProgressHandler).ConfigureAwait(false); } } else { throw new UnauthorizedAccessException(); } }
public static async Task ExtractGZipAsync(FileSystemStorageFile Item, ProgressChangedEventHandler ProgressHandler = null) { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(Path.GetDirectoryName(Item.Path), Path.GetFileNameWithoutExtension(Item.Name)), StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream SourceFileStream = await Item.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false)) using (FileStream NewFileStrem = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write)) using (GZipInputStream GZipStream = new GZipInputStream(SourceFileStream)) { await GZipStream.CopyToAsync(NewFileStrem, ProgressHandler).ConfigureAwait(false); } } else { throw new UnauthorizedAccessException(); } }
public static async Task ExtractBZip2Async(FileSystemStorageFile Source, string NewDirectoryPath, ProgressChangedEventHandler ProgressHandler = null) { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(NewDirectoryPath, Path.GetFileNameWithoutExtension(Source.Name)), StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream SourceFileStream = await Source.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false)) using (FileStream NewFileStrem = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write)) using (BZip2InputStream BZip2Stream = new BZip2InputStream(SourceFileStream)) { BZip2Stream.IsStreamOwner = false; await BZip2Stream.CopyToAsync(NewFileStrem, ProgressHandler : ProgressHandler).ConfigureAwait(false); } } else { throw new UnauthorizedAccessException(); } }
public static async Task CreateBZip2Async(FileSystemStorageFile Source, string NewZipPath, ProgressChangedEventHandler ProgressHandler = null) { if (await FileSystemStorageItemBase.CreateAsync(NewZipPath, StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream SourceFileStream = await Source.GetFileStreamFromFileAsync(AccessMode.Read)) using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Exclusive)) using (BZip2OutputStream BZip2Stream = new BZip2OutputStream(NewFileStream)) { BZip2Stream.IsStreamOwner = false; await SourceFileStream.CopyToAsync(BZip2Stream, ProgressHandler : ProgressHandler).ConfigureAwait(false); } } else { throw new UnauthorizedAccessException(); } }
public static async Task ExtractGZipAsync(FileSystemStorageFile Source, string NewDirectoryPath, ProgressChangedEventHandler ProgressHandler = null) { using (FileStream SourceFileStream = await Source.GetFileStreamFromFileAsync(AccessMode.Exclusive)) { string NewFilePath = Path.Combine(NewDirectoryPath, Path.GetFileNameWithoutExtension(Source.Path)); using (GZipInputStream GZipStream = new GZipInputStream(SourceFileStream)) { GZipStream.IsStreamOwner = false; await GZipStream.ReadAsync(new byte[128], 0, 128); string GZipInnerFileName = GZipStream.GetFilename(); if (!string.IsNullOrEmpty(GZipInnerFileName)) { NewFilePath = Path.Combine(NewDirectoryPath, GZipInnerFileName); } } SourceFileStream.Seek(0, SeekOrigin.Begin); using (GZipInputStream GZipStream = new GZipInputStream(SourceFileStream)) { GZipStream.IsStreamOwner = false; if (await FileSystemStorageItemBase.CreateAsync(NewFilePath, StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream NewFileStrem = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write)) { await GZipStream.CopyToAsync(NewFileStrem, ProgressHandler : ProgressHandler).ConfigureAwait(false); } } else { throw new UnauthorizedAccessException(); } } } }
public static async Task ExtractTarAsync(FileSystemStorageFolder NewFolder, FileSystemStorageFile File, ProgressChangedEventHandler ProgressHandler = null) { using (FileStream BaseStream = await File.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false)) using (TarInputStream InputTarStream = new TarInputStream(BaseStream, Encoding.UTF8)) { BaseStream.Seek(0, SeekOrigin.Begin); InputTarStream.IsStreamOwner = false; long CurrentPosition = 0; while (InputTarStream.GetNextEntry() is TarEntry Entry) { if (Entry.Name.Contains("/")) { string[] SplitFolderPath = Entry.Name.Split('/', StringSplitOptions.RemoveEmptyEntries); string TempFolderPath = NewFolder.Path; for (int i = 0; i < SplitFolderPath.Length - 1; i++) { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(TempFolderPath, SplitFolderPath[i]), StorageItemTypes.Folder, CreateOption.OpenIfExist).ConfigureAwait(false) is FileSystemStorageFolder NextFolder) { TempFolderPath = NextFolder.Path; } else { throw new UnauthorizedAccessException("Could not create directory"); } } if (Entry.Name.Last() == '/') { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(TempFolderPath, SplitFolderPath.Last()), StorageItemTypes.Folder, CreateOption.OpenIfExist).ConfigureAwait(false) == null) { throw new UnauthorizedAccessException("Could not create directory"); } } else { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(TempFolderPath, SplitFolderPath.Last()), StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write).ConfigureAwait(false)) { if (Entry.Size > 0) { await InputTarStream.CopyToAsync(NewFileStream, (s, e) => { ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToInt64(e.ProgressPercentage / 100d * Entry.Size)) * 100d / BaseStream.Length), null)); }).ConfigureAwait(false); } else { await InputTarStream.CopyToAsync(NewFileStream).ConfigureAwait(false); } } } else { throw new UnauthorizedAccessException(); } } } else { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(NewFolder.Path, Entry.Name), StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write).ConfigureAwait(false)) { if (Entry.Size > 0) { await InputTarStream.CopyToAsync(NewFileStream, (s, e) => { ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToInt64(e.ProgressPercentage / 100d * Entry.Size)) * 100d / BaseStream.Length), null)); }).ConfigureAwait(false); } else { await InputTarStream.CopyToAsync(NewFileStream).ConfigureAwait(false); } } } else { throw new UnauthorizedAccessException(); } } ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition = BaseStream.Position) * 100d / BaseStream.Length), null)); } } }
/// <summary> /// 执行ZIP解压功能 /// </summary> /// <param name="File">ZIP文件</param> /// <returns>无</returns> public static async Task ExtractZipAsync(FileSystemStorageFolder NewFolder, FileSystemStorageFile File, ProgressChangedEventHandler ProgressHandler = null) { ZipStrings.CodePage = EncodingSetting.CodePage; using (FileStream BaseStream = await File.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false)) using (ZipInputStream InputZipStream = new ZipInputStream(BaseStream)) { BaseStream.Seek(0, SeekOrigin.Begin); InputZipStream.IsStreamOwner = false; long CurrentPosition = 0; while (InputZipStream.GetNextEntry() is ZipEntry Entry) { if (!InputZipStream.CanDecompressEntry || Entry.IsCrypted) { throw new NotImplementedException(); } if (Entry.Name.Contains("/")) { string[] SplitFolderPath = Entry.Name.Split('/', StringSplitOptions.RemoveEmptyEntries); string TempFolderPath = NewFolder.Path; for (int i = 0; i < SplitFolderPath.Length - 1; i++) { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(TempFolderPath, SplitFolderPath[i]), StorageItemTypes.Folder, CreateOption.OpenIfExist).ConfigureAwait(false) is FileSystemStorageFolder NextFolder) { TempFolderPath = NextFolder.Path; } else { throw new UnauthorizedAccessException("Could not create directory"); } } if (Entry.Name.Last() == '/') { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(TempFolderPath, SplitFolderPath.Last()), StorageItemTypes.Folder, CreateOption.OpenIfExist).ConfigureAwait(false) == null) { throw new UnauthorizedAccessException("Could not create directory"); } } else { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(TempFolderPath, SplitFolderPath.Last()), StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write).ConfigureAwait(false)) { //For some files in Zip, CompressedSize or Size might less than zero, then we could not get progress by reading ZipInputStream.Length if (Entry.CompressedSize > 0 && Entry.Size > 0) { await InputZipStream.CopyToAsync(NewFileStream, (s, e) => { ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToInt64(e.ProgressPercentage / 100d * Entry.CompressedSize)) * 100d / BaseStream.Length), null)); }).ConfigureAwait(false); } else { await InputZipStream.CopyToAsync(NewFileStream).ConfigureAwait(false); } } } else { throw new UnauthorizedAccessException(); } } } else { if (await FileSystemStorageItemBase.CreateAsync(Path.Combine(NewFolder.Path, Entry.Name), StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile) { using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Write).ConfigureAwait(false)) { //For some files in Zip, CompressedSize or Size might less than zero, then we could not get progress by reading ZipInputStream.Length if (Entry.CompressedSize > 0 && Entry.Size > 0) { await InputZipStream.CopyToAsync(NewFileStream, (s, e) => { ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToInt64(e.ProgressPercentage / 100d * Entry.CompressedSize)) * 100d / BaseStream.Length), null)); }).ConfigureAwait(true); } else { await InputZipStream.CopyToAsync(NewFileStream).ConfigureAwait(false); } } } else { throw new UnauthorizedAccessException(); } } ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition = BaseStream.Position) * 100d / BaseStream.Length), null)); } } }