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...