Fix build_init vcxproj to correctly detect changes in config.h.
[mono.git] / mcs / class / System.IO.Compression / SharpCompress / Archive / IArchiveEntry.Extensions.cs
1 using System.IO;
2 using SharpCompress.Common;
3 using SharpCompress.IO;
4
5 namespace SharpCompress.Archive
6 {
7     internal static class IArchiveEntryExtensions
8     {
9         public static void WriteTo(this IArchiveEntry archiveEntry, Stream streamToWriteTo)
10         {
11             if (archiveEntry.Archive.Type == ArchiveType.Rar && archiveEntry.Archive.IsSolid)
12             {
13                 throw new InvalidFormatException("Cannot use Archive random access on SOLID Rar files.");
14             }
15
16             if (archiveEntry.IsDirectory)
17             {
18                 throw new ExtractionException("Entry is a file directory and cannot be extracted.");
19             }
20
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)
27             {
28                 return;
29             }
30             using(entryStream)
31             using (Stream s = new ListeningStream(streamListener, entryStream))
32             {
33                 s.TransferTo(streamToWriteTo);
34             }
35             streamListener.FireEntryExtractionEnd(archiveEntry);
36         }
37
38 #if !PORTABLE && !NETFX_CORE
39         /// <summary>
40         /// Extract to specific directory, retaining filename
41         /// </summary>
42         public static void WriteToDirectory(this IArchiveEntry entry, string destinationDirectory,
43                                             ExtractOptions options = ExtractOptions.Overwrite)
44         {
45             string destinationFileName;
46             string file = Path.GetFileName(entry.Key);
47
48
49             if (options.HasFlag(ExtractOptions.ExtractFullPath))
50             {
51                 string folder = Path.GetDirectoryName(entry.Key);
52                 string destdir = Path.Combine(destinationDirectory, folder);
53                 if (!Directory.Exists(destdir))
54                 {
55                     Directory.CreateDirectory(destdir);
56                 }
57                 destinationFileName = Path.Combine(destdir, file);
58             }
59             else
60             {
61                 destinationFileName = Path.Combine(destinationDirectory, file);
62             }
63             entry.WriteToFile(destinationFileName, options);
64         }
65
66         /// <summary>
67         /// Extract to specific file
68         /// </summary>
69         public static void WriteToFile(this IArchiveEntry entry, string destinationFileName,
70                                        ExtractOptions options = ExtractOptions.Overwrite)
71         {
72             if (entry.IsDirectory)
73             {
74                 return;
75             }
76             FileMode fm = FileMode.Create;
77
78             if (!options.HasFlag(ExtractOptions.Overwrite))
79             {
80                 fm = FileMode.CreateNew;
81             }
82             using (FileStream fs = File.Open(destinationFileName, fm))
83             {
84                 entry.WriteTo(fs);
85             }
86         }
87 #endif
88     }
89 }