private IAsyncOperation <ZipFile> OpenZipFileAsync(FileAccessMode accessMode) { return(AsyncInfo.Run <ZipFile>(async(cancellationToken) => { bool readWrite = accessMode == FileAccessMode.ReadWrite; if (BackingFile != null) { return new ZipFile((await BackingFile.OpenAsync(accessMode)).AsStream()); } else { var hFile = NativeFileOperationsHelper.OpenFileForRead(ContainerPath, readWrite); if (hFile.IsInvalid) { return null; } return new ZipFile((Stream) new FileStream(hFile, readWrite ? FileAccess.ReadWrite : FileAccess.Read)); } })); }
public override IAsyncOperation <IRandomAccessStream> OpenAsync(FileAccessMode accessMode) { return(AsyncInfo.Run <IRandomAccessStream>(async(cancellationToken) => { bool rw = accessMode == FileAccessMode.ReadWrite; if (Path == ContainerPath) { if (BackingFile != null) { return await BackingFile.OpenAsync(accessMode); } else { var hFile = NativeFileOperationsHelper.OpenFileForRead(ContainerPath, rw); if (hFile.IsInvalid) { return null; } return new FileStream(hFile, rw ? FileAccess.ReadWrite : FileAccess.Read).AsRandomAccessStream(); } } if (!rw) { ZipFile zipFile = await OpenZipFileAsync(accessMode); if (zipFile == null) { return null; } zipFile.IsStreamOwner = true; var znt = new ZipNameTransform(ContainerPath); var entry = zipFile.GetEntry(znt.TransformFile(Path)); if (entry != null) { return new NonSeekableRandomAccessStreamForRead(zipFile.GetInputStream(entry), (ulong)entry.Size) { DisposeCallback = () => zipFile.Close() }; } } else { var znt = new ZipNameTransform(ContainerPath); var zipDesiredName = znt.TransformFile(Path); using (ZipFile zipFile = await OpenZipFileAsync(accessMode)) { var entry = zipFile.GetEntry(zipDesiredName); if (entry != null) { zipFile.BeginUpdate(new MemoryArchiveStorage(FileUpdateMode.Direct)); zipFile.Delete(entry); zipFile.CommitUpdate(); } } if (BackingFile != null) { var zos = new ZipOutputStream((await BackingFile.OpenAsync(FileAccessMode.ReadWrite)).AsStream(), true); await zos.PutNextEntryAsync(new ZipEntry(zipDesiredName)); return new NonSeekableRandomAccessStreamForWrite(zos); } else { var hFile = NativeFileOperationsHelper.OpenFileForRead(ContainerPath, true); if (hFile.IsInvalid) { return null; } var zos = new ZipOutputStream(new FileStream(hFile, FileAccess.ReadWrite), true); await zos.PutNextEntryAsync(new ZipEntry(zipDesiredName)); return new NonSeekableRandomAccessStreamForWrite(zos); } } return null; })); }