2 using SharpCompress.Common;
3 using SharpCompress.IO;
5 namespace SharpCompress.Archive
7 internal static class IArchiveEntryExtensions
9 public static void WriteTo(this IArchiveEntry archiveEntry, Stream streamToWriteTo)
11 if (archiveEntry.Archive.Type == ArchiveType.Rar && archiveEntry.Archive.IsSolid)
13 throw new InvalidFormatException("Cannot use Archive random access on SOLID Rar files.");
16 if (archiveEntry.IsDirectory)
18 throw new ExtractionException("Entry is a file directory and cannot be extracted.");
21 var streamListener = archiveEntry.Archive as IArchiveExtractionListener;
22 streamListener.EnsureEntriesLoaded();
23 streamListener.FireEntryExtractionBegin(archiveEntry);
24 streamListener.FireFilePartExtractionBegin(archiveEntry.Key, archiveEntry.Size, archiveEntry.CompressedSize);
25 var entryStream = archiveEntry.OpenEntryStream();
26 if (entryStream == null)
31 using (Stream s = new ListeningStream(streamListener, entryStream))
33 s.TransferTo(streamToWriteTo);
35 streamListener.FireEntryExtractionEnd(archiveEntry);
38 #if !PORTABLE && !NETFX_CORE
40 /// Extract to specific directory, retaining filename
42 public static void WriteToDirectory(this IArchiveEntry entry, string destinationDirectory,
43 ExtractOptions options = ExtractOptions.Overwrite)
45 string destinationFileName;
46 string file = Path.GetFileName(entry.Key);
49 if (options.HasFlag(ExtractOptions.ExtractFullPath))
51 string folder = Path.GetDirectoryName(entry.Key);
52 string destdir = Path.Combine(destinationDirectory, folder);
53 if (!Directory.Exists(destdir))
55 Directory.CreateDirectory(destdir);
57 destinationFileName = Path.Combine(destdir, file);
61 destinationFileName = Path.Combine(destinationDirectory, file);
63 entry.WriteToFile(destinationFileName, options);
67 /// Extract to specific file
69 public static void WriteToFile(this IArchiveEntry entry, string destinationFileName,
70 ExtractOptions options = ExtractOptions.Overwrite)
72 if (entry.IsDirectory)
76 FileMode fm = FileMode.Create;
78 if (!options.HasFlag(ExtractOptions.Overwrite))
80 fm = FileMode.CreateNew;
82 using (FileStream fs = File.Open(destinationFileName, fm))