123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #if !NO_FILE
- using System;
- using System.IO;
- #endif
- namespace SharpCompress.Common
- {
- internal static class ExtractionMethods
- {
-
- #if !NO_FILE
- /// <summary>
- /// Extract to specific directory, retaining filename
- /// </summary>
- public static void WriteEntryToDirectory(IEntry entry, string destinationDirectory,
- ExtractionOptions options, Action<string, ExtractionOptions> write)
- {
- string destinationFileName;
- string file = Path.GetFileName(entry.Key);
- string fullDestinationDirectoryPath = Path.GetFullPath(destinationDirectory);
- options = options ?? new ExtractionOptions()
- {
- Overwrite = true
- };
- if (options.ExtractFullPath)
- {
- string folder = Path.GetDirectoryName(entry.Key);
- string destdir = Path.GetFullPath(
- Path.Combine(fullDestinationDirectoryPath, folder)
- );
- if (!Directory.Exists(destdir))
- {
- if (!destdir.StartsWith(fullDestinationDirectoryPath))
- {
- throw new ExtractionException("Entry is trying to create a directory outside of the destination directory.");
- }
- Directory.CreateDirectory(destdir);
- }
- destinationFileName = Path.Combine(destdir, file);
- }
- else
- {
- destinationFileName = Path.Combine(fullDestinationDirectoryPath, file);
- }
- if (!entry.IsDirectory)
- {
- destinationFileName = Path.GetFullPath(destinationFileName);
- if (!destinationFileName.StartsWith(fullDestinationDirectoryPath))
- {
- throw new ExtractionException("Entry is trying to write a file outside of the destination directory.");
- }
- write(destinationFileName, options);
- }
- else if (options.ExtractFullPath && !Directory.Exists(destinationFileName))
- {
- Directory.CreateDirectory(destinationFileName);
- }
- }
-
- public static void WriteEntryToFile(IEntry entry, string destinationFileName,
- ExtractionOptions options,
- Action<string, FileMode> openAndWrite)
- {
- FileMode fm = FileMode.Create;
- options = options ?? new ExtractionOptions()
- {
- Overwrite = true
- };
- if (!options.Overwrite)
- {
- fm = FileMode.CreateNew;
- }
- openAndWrite(destinationFileName, fm);
- entry.PreserveExtractionOptions(destinationFileName, options);
- }
- #endif
- }
- }
|