private ZipEntry AddOrUpdateDirectoryImpl(string directoryName, string rootDirectoryPathInArchive, AddOrUpdateAction action) { if (rootDirectoryPathInArchive == null) { rootDirectoryPathInArchive = ""; } return(AddOrUpdateDirectoryImpl(directoryName, rootDirectoryPathInArchive, action, true, 0)); }
private ZipEntry AddOrUpdateDirectoryImpl(string directoryName, string rootDirectoryPathInArchive, AddOrUpdateAction action, bool recurse, int level) { if (Verbose) StatusMessageTextWriter.WriteLine("{0} {1}...", (action == AddOrUpdateAction.AddOnly) ? "adding" : "Adding or updating", directoryName); if (level == 0) { _addOperationCanceled = false; OnAddStarted(); } // workitem 13371 if (_addOperationCanceled) return null; string dirForEntries = rootDirectoryPathInArchive; ZipEntry baseDir = null; if (level > 0) { int f = directoryName.Length; for (int i = level; i > 0; i--) f = directoryName.LastIndexOfAny("/\\".ToCharArray(), f - 1, f - 1); dirForEntries = directoryName.Substring(f + 1); dirForEntries = Path.Combine(rootDirectoryPathInArchive, dirForEntries); } // if not top level, or if the root is non-empty, then explicitly add the directory if (level > 0 || rootDirectoryPathInArchive != "") { baseDir = ZipEntry.CreateFromFile(directoryName, dirForEntries); baseDir._container = new ZipContainer(this); baseDir.AlternateEncoding = this.AlternateEncoding; // workitem 6410 baseDir.AlternateEncodingUsage = this.AlternateEncodingUsage; baseDir.MarkAsDirectory(); baseDir.EmitTimesInWindowsFormatWhenSaving = _emitNtfsTimes; baseDir.EmitTimesInUnixFormatWhenSaving = _emitUnixTimes; // add the directory only if it does not exist. // It's not an error if it already exists. if (!_entries.ContainsKey(baseDir.FileName)) { InternalAddEntry(baseDir.FileName,baseDir); AfterAddEntry(baseDir); } dirForEntries = baseDir.FileName; } if (!_addOperationCanceled) { IEnumerable<string> filenames = Directory.EnumerateFiles(directoryName); if (recurse) { // add the files: foreach (String filename in filenames) { if (_addOperationCanceled) break; if (action == AddOrUpdateAction.AddOnly) AddFile(filename, dirForEntries); else UpdateFile(filename, dirForEntries); } if (!_addOperationCanceled) { // add the subdirectories: IEnumerable<string> dirnames = Directory.EnumerateDirectories(directoryName); foreach (String dir in dirnames) { // workitem 8617: Optionally traverse reparse points #if NETCF FileAttributes fileAttrs = (FileAttributes) NetCfFile.GetAttributes(dir); #else FileAttributes fileAttrs = System.IO.File.GetAttributes(dir); #endif if (this.AddDirectoryWillTraverseReparsePoints || ((fileAttrs & FileAttributes.ReparsePoint) == 0)) AddOrUpdateDirectoryImpl(dir, rootDirectoryPathInArchive, action, recurse, level + 1); } } } } if (level == 0) OnAddCompleted(); return baseDir; }
private ZipEntry AddOrUpdateDirectoryImpl(string directoryName, string rootDirectoryPathInArchive, AddOrUpdateAction action) { if (rootDirectoryPathInArchive == null) { rootDirectoryPathInArchive = ""; } return AddOrUpdateDirectoryImpl(directoryName, rootDirectoryPathInArchive, action, true, 0); }
private void AddOrUpdateDirectoryImpl(String directoryName, String rootDirectoryPathInArchive, AddOrUpdateAction action, int level) { if (this.Verbose) { this.StatusMessageTextWriter.WriteLine("{0} {1}...", (action == AddOrUpdateAction.AddOnly) ? "adding" : "Adding or updating", directoryName); } String dirForEntries = rootDirectoryPathInArchive; if (level > 0) { int f = directoryName.Length; for (int i = level; i > 0; i--) { f = directoryName.LastIndexOfAny(@"/\".ToCharArray(), f - 1, f - 1); } dirForEntries = directoryName.Substring(f + 1); dirForEntries = Path.Combine(rootDirectoryPathInArchive, dirForEntries); } if ((level > 0) || (rootDirectoryPathInArchive != "")) { ZipEntry baseDir = ZipEntry.Create(directoryName, dirForEntries); baseDir.Encoding = this.Encoding; baseDir.TrimVolumeFromFullyQualifiedPaths = this.TrimVolumeFromFullyQualifiedPaths; baseDir._Source = EntrySource.Filesystem; baseDir.MarkAsDirectory(); ZipEntry e = this[baseDir.FileName]; if (e == null) { this._entries.Add(baseDir); this._contentsChanged = true; } dirForEntries = baseDir.FileName; } String[] filenames = Directory.GetFiles(directoryName); foreach (String filename in filenames) { if (action == AddOrUpdateAction.AddOnly) { this.AddFile(filename, dirForEntries); } else { this.UpdateFile(filename, dirForEntries); } } String[] dirnames = Directory.GetDirectories(directoryName); foreach (String dir in dirnames) { this.AddOrUpdateDirectoryImpl(dir, rootDirectoryPathInArchive, action, level + 1); } this._contentsChanged = true; }
private void AddOrUpdateDirectoryImpl(String directoryName, String rootDirectoryPathInArchive, AddOrUpdateAction action) { if (rootDirectoryPathInArchive == null) { rootDirectoryPathInArchive = ""; } this.AddOrUpdateDirectoryImpl(directoryName, rootDirectoryPathInArchive, action, 0); }
private ZipEntry AddOrUpdateDirectoryImpl(string directoryName, string rootDirectoryPathInArchive, AddOrUpdateAction action, bool recurse, int level) { if (Verbose) { StatusMessageTextWriter.WriteLine("{0} {1}...", (action == AddOrUpdateAction.AddOnly) ? "adding" : "Adding or updating", directoryName); } if (level == 0) { _addOperationCanceled = false; OnAddStarted(); } // workitem 13371 if (_addOperationCanceled) { return(null); } string dirForEntries = rootDirectoryPathInArchive; ZipEntry baseDir = null; if (level > 0) { int f = directoryName.Length; for (int i = level; i > 0; i--) { f = directoryName.LastIndexOfAny("/\\".ToCharArray(), f - 1, f - 1); } dirForEntries = directoryName.Substring(f + 1); dirForEntries = Path.Combine(rootDirectoryPathInArchive, dirForEntries); } // if not top level, or if the root is non-empty, then explicitly add the directory if (level > 0 || rootDirectoryPathInArchive != "") { baseDir = ZipEntry.CreateFromFile(directoryName, dirForEntries); baseDir._container = new ZipContainer(this); baseDir.AlternateEncoding = this.AlternateEncoding; // workitem 6410 baseDir.AlternateEncodingUsage = this.AlternateEncodingUsage; baseDir.MarkAsDirectory(); baseDir.EmitTimesInWindowsFormatWhenSaving = _emitNtfsTimes; baseDir.EmitTimesInUnixFormatWhenSaving = _emitUnixTimes; // add the directory only if it does not exist. // It's not an error if it already exists. if (!_entries.ContainsKey(baseDir.FileName)) { InternalAddEntry(baseDir.FileName, baseDir); AfterAddEntry(baseDir); } dirForEntries = baseDir.FileName; } if (!_addOperationCanceled) { String[] filenames = Directory.GetFiles(directoryName); if (recurse) { // add the files: foreach (String filename in filenames) { if (_addOperationCanceled) { break; } if (action == AddOrUpdateAction.AddOnly) { AddFile(filename, dirForEntries); } else { UpdateFile(filename, dirForEntries); } } if (!_addOperationCanceled) { // add the subdirectories: String[] dirnames = Directory.GetDirectories(directoryName); foreach (String dir in dirnames) { // workitem 8617: Optionally traverse reparse points FileAttributes fileAttrs = System.IO.File.GetAttributes(dir); if (this.AddDirectoryWillTraverseReparsePoints || ((fileAttrs & FileAttributes.ReparsePoint) == 0) ) { AddOrUpdateDirectoryImpl(dir, rootDirectoryPathInArchive, action, recurse, level + 1); } } } } } if (level == 0) { OnAddCompleted(); } return(baseDir); }
private void _AddOrUpdateSelectedFiles(String selectionCriteria, String directoryOnDisk, String directoryPathInArchive, bool recurseDirectories, bool wantUpdate) { if (directoryOnDisk == null && (Directory.Exists(selectionCriteria))) { directoryOnDisk = selectionCriteria; selectionCriteria = "*.*"; } else if (String.IsNullOrEmpty(directoryOnDisk)) { directoryOnDisk = "."; } // workitem 9176 while (directoryOnDisk.EndsWith("\\")) { directoryOnDisk = directoryOnDisk.Substring(0, directoryOnDisk.Length - 1); } if (Verbose) { StatusMessageTextWriter.WriteLine("adding selection '{0}' from dir '{1}'...", selectionCriteria, directoryOnDisk); } Ionic.FileSelector ff = new Ionic.FileSelector(selectionCriteria, AddDirectoryWillTraverseReparsePoints); var itemsToAdd = ff.SelectFiles(directoryOnDisk, recurseDirectories); if (Verbose) { StatusMessageTextWriter.WriteLine("found {0} files...", itemsToAdd.Count); } OnAddStarted(); AddOrUpdateAction action = (wantUpdate) ? AddOrUpdateAction.AddOrUpdate : AddOrUpdateAction.AddOnly; foreach (var item in itemsToAdd) { // workitem 10153 string dirInArchive = (directoryPathInArchive == null) ? null // workitem 12260 : ReplaceLeadingDirectory(Path.GetDirectoryName(item), directoryOnDisk, directoryPathInArchive); if (File.Exists(item)) { if (wantUpdate) { this.UpdateFile(item, dirInArchive); } else { this.AddFile(item, dirInArchive); } } else { // this adds "just" the directory, without recursing to the contained files AddOrUpdateDirectoryImpl(item, dirInArchive, action, false, 0); } } OnAddCompleted(); }
internal static ZipEntry AddOrUpdateDirectoryImpl(this ZipFile zipFile, string directoryName, string rootDirectoryPathInArchive, AddOrUpdateAction action, bool recurse, int level) { string fullPath = GetFullPath(directoryName); if (zipFile.StatusMessageTextWriter != null) zipFile.StatusMessageTextWriter.WriteLine("{0} {1}...", (action == AddOrUpdateAction.AddOnly) ? "adding" : "Adding or updating", directoryName); if (level == 0) { zipFile.SetAddOperationCanceled(false); zipFile.OnAddStarted(); } // workitem 13371 if (zipFile.IsAddOperationCanceled()) return null; string dirForEntries = rootDirectoryPathInArchive; ZipEntry baseDir = null; if (level > 0) { int f = directoryName.Length; for (int i = level; i > 0; i--) f = directoryName.LastIndexOfAny("/\\".ToCharArray(), f - 1, f - 1); dirForEntries = directoryName.Substring(f + 1); dirForEntries = Path.Combine(rootDirectoryPathInArchive, dirForEntries); } // if not top level, or if the root is non-empty, then explicitly add the directory if (level > 0 || rootDirectoryPathInArchive != "") { // add the directory only if it does not exist. // It's not an error if it already exists. dirForEntries = ZipEntryInternal.NameInArchive(dirForEntries) + '/'; if (!zipFile.EntryFileNames.Contains(dirForEntries)) { baseDir = zipFile.AddDirectoryByName(dirForEntries); } } if (!zipFile.IsAddOperationCanceled()) { IFile fileCheck = FileSystem.Current.GetFileFromPathAsync(fullPath).ExecuteSync(); if (fileCheck != null) { throw new IOException(string.Format("That path ({0}) is a file, not a directory!", directoryName)); } IFolder folder = FileSystem.Current.GetFolderFromPathAsync(fullPath).ExecuteSync(); if (folder == null) { throw new FileNotFoundException(string.Format("That folder ({0}) does not exist!", directoryName)); } IList<IFile> files = folder.GetFilesAsync().ExecuteSync(); if (recurse) { // add the files: foreach (IFile file in files) { if (zipFile.IsAddOperationCanceled()) break; if (action == AddOrUpdateAction.AddOnly) zipFile.AddFile(file.Path, dirForEntries); else zipFile.UpdateFile(file.Path, dirForEntries); } if (!zipFile.IsAddOperationCanceled()) { // add the subdirectories: IList<IFolder> dirs = folder.GetFoldersAsync().ExecuteSync(); foreach (IFolder dir in dirs) { zipFile.AddOrUpdateDirectoryImpl(dir.Path, rootDirectoryPathInArchive, action, recurse, level + 1); } } } } if (level == 0) zipFile.OnAddCompleted(); return baseDir; }
internal static ZipEntry AddOrUpdateDirectoryImpl(this ZipFile zipFile, string directoryName, string rootDirectoryPathInArchive, AddOrUpdateAction action) { if (rootDirectoryPathInArchive == null) { rootDirectoryPathInArchive = ""; } return zipFile.AddOrUpdateDirectoryImpl(directoryName, rootDirectoryPathInArchive, action, true, 0); }