More .NET libraries
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
Directory operations
On this page:
- Listing ZIP archive content (recursively)
- Listing directory content (non-recursively)
- Sorting content listings
- LINQ support - IEnumerable<T> collection
- Displaying listing progress
- Creating a directory
- Deleting a directory
- Deleting directories recursively
- Renaming/moving a directory
- Checking directory existence
Listing ZIP archive content (recursively)
To get listing of ZIP archive contents, use GetItems
method.
ZipItemCollection items; // get all items in ZIP archive items = zip.GetItems(); // get all ".txt" files of "/data" directory only // (files from subdirectories are not returned) items = zip.GetItems("/data/*.txt", TraversalMode.MatchFilesShallow); // get all ".txt" files under "/data" directory // (files from subdirectories are returned as well) items = zip.GetItems("/data/*.txt", TraversalMode.MatchFilesDeep); // initialize a file set var fileSet = new Rebex.IO.FileSet("/data"); fileSet.Include("Web"); fileSet.Exclude("Web/Images"); // get all items defined by the file set items = zip.GetItems(fileSet);
Tip: Check out more information on wildcards, traversal modes and file sets.
Listing directory content (non-recursively)
To get listing of single directory contents, use GetItems
method with "*" wildcard and TraversalMode.NonRecursive
mode.
// get all items in the root of the ZIP archive ZipItemCollection rootItems = zip.GetItems("*", TraversalMode.NonRecursive); // get all items in "/data" directory ZipItemCollection dataItems = zip.GetItems("/data/*", TraversalMode.NonRecursive);
Sorting content listings
By default, GetItems
method lists directory items in the original order (as present in the ZIP archive), which is often unsorted.
To sort the results, use ZipItemCollection
's Sort
method and
FileSystemItemComparer
object.
// get all items in the ZIP archive ZipItemCollection items = zip.GetItems(); // example 1: sort the collection by name (directories first) items.Sort(); // example 2: large files first items.Sort(new FileSystemItemComparer(FileSystemItemComparerType.Length)); // example 3: order by multiple fields // (directories first, then order by time of last modification) items.Sort(new MultiComparer( new FileSystemItemComparer(FileSystemItemComparerType.FileType), new FileSystemItemComparer(FileSystemItemComparerType.LastWriteTime)));
For more sorting options, see FileSystemItemComparerType
enum.
LINQ support - IEnumerable<T> collection
The ZipItemCollection
object returned by GetItems
method implements IEnumerable<ZipItem>
to support LINQ queries.
Note: ZipItemCollection
implements IEnumerable<ArchiveItem>
as well,
which means that casting it to IEnumerable<ZipItem>
using Cast<ZipItem>
might be necessary in order to use proper LINQ extension methods.
DateTime dt = DateTime.Now.Date.AddDays(-7); // get all ".txt" files not older than 7 days sorted by path // from current directory using LINQ methods var files1 = zip.GetItems("*.txt", TraversalMode.Recursive).Cast<ZipItem>(). Where(item => item.IsFile && item.LastWriteTime > dt). OrderBy(item => item.Path); // get all ".txt" files not older than 7 days sorted by path // anywhere under the current directory using a LINQ query var items = zip.GetItems("*.txt", TraversalMode.MatchFilesDeep); var files2 = from ZipItem item in items where item.IsFile && item.LastWriteTime > dt orderby item.Path select item;
Displaying listing progress
The GetItems
method raises a ProgressChanged
event when a directory is processed (ArchiveOperationStep.DirectoryRetrieved
).
This is useful when working with huge directory listings because it makes it possible to display progress as they are listed.
Custom listing progress example:
// register an event handler which is raised // when a directory listing is in progress zip.ProgressChanged += (s, e) => { // display directory listing progress information if (e.OperationStep == ArchiveOperationStep.DirectoryRetrieved) { Console.WriteLine("Processed directory: {0}", e.ArchiveItemPath); Console.WriteLine(" - total items so far: {0}", e.FilesTotal); } }; // retrieve specified files and display listing progress var items = zip.GetItems("*.txt", TraversalMode.MatchFilesDeep);
Creating a directory
To create a new directory in a ZIP archive, use CreateDirectory
method.
CreateDirectory
method returns a ZipItem
object that represents the newly-created directory.
// create a new directory in the ZIP archive ZipItem newDir = zip.CreateDirectory("/data/Exports"); // access item info if needed Console.WriteLine("New directory created: {0}", newDir.Path);
Deleting a directory
To delete an empty ZIP archive directory, use Delete
method.
// delete ZIP archive directory // delete directory if it is empty if (zip["/data/Exports"].IsEmptyDirectory) { zip.Delete("/data/Exports", TraversalMode.NonRecursive); }
Deleting directories recursively
To delete non-empty ZIP archive directories or multiple files, pass TraversalMode.Recursive
to the Delete
method.
// delete whole ZIP archive directory // (deletes the "/data/temp" directory as well) zip.Delete("/data/temp", TraversalMode.Recursive); // delete all ".txt" files in ZIP archive's "/data" zip.Delete("/data/*.txt", TraversalMode.MatchFilesShallow); // delete contents of ZIP archive's "/data" directory // (keeps the empty "/data" directory) zip.Delete("/data/*", TraversalMode.Recursive);
Renaming/moving a directory
To rename or move a directory (or a file) within a ZIP archive, use Move
method.
// rename a directory zip["/data/Subdir1"].Rename("Renamed"); // move a directory zip.Move("/data/Subdir2", "/Moved/Subdir2"); // move a directory and rename it as well zip.Move("/data/Subdir3", "/Moved/Renamed");
Tip: Rebex ZIP makes it possible to move files and directories between a ZIP archive and the file system as well.
Back to feature list...