I have a directory where all kind of random data is in it including ZIP archives which could also include ZIP archives itself and so on. What I want to count is all data except the ZIP archives.
My attempt with starting to count the data in the ZIP files:
static void Main(string[] args)
{
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Temp");
int count = 0;
foreach (FileInfo file in directoryInfo.GetFiles())
{
if (file.Extension.Equals(".zip"))
{
count += ZipFileCount(file.FullName);
}
}
Console.WriteLine(count);
}
public static int ZipFileCount(String zipFileName)
{
using (ZipArchive archive = ZipFile.Open(zipFileName, ZipArchiveMode.Read))
{
foreach (var entry in archive.Entries)
{
if (!String.IsNullOrEmpty(entry.Name))
{
count += 1;
if (entry.Name.Substring(entry.Name.Length - 3).Equals("zip"))
{
ZipFileCount(entry.Name);
}
}
}
return count;
}
}
That didn't work out as ZipFileCount(entry.Name)
does not provide the right entries in the ZIP of the ZIP.
Anybody can help me out to fix this?
One way of accomplishing it is extracting all the zips to a temporary folder recursively and then count for non-zip files inside of those directories. Once we get the count we can delete the intermediate files and revert the system to initial state. Remember the user needs to have write permissions on the file system to run the code in that particular directory.
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Temp");
ProcessDirectory(directoryInfo); // Process the directory and extract any zip files.
int count = 0;
foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
{
if (subdirectory.Name.EndsWith(".ExtractedFiles")) // Count only extracted zip files in root directory.
{
count = CountFiles(subdirectory, count);
}
}
DeleteIntermediateFiles(directoryInfo); // Delete the extracted files.
Console.WriteLine(count);
}
public static void ProcessDirectory(DirectoryInfo directoryInfo)
{
foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
{
ProcessDirectory(subdirectory); //Process subdirectories.
}
ProcessFiles(directoryInfo); //Process files.
}
private static void ProcessFiles(DirectoryInfo directoryInfo)
{
foreach (FileInfo file in directoryInfo.EnumerateFiles())
{
if (file.Extension.Equals(".zip")) // extract zip files.
{
var extractFilesDirectory = directoryInfo.CreateSubdirectory(
Path.GetFileNameWithoutExtension(file.Name) + ".ExtractedFiles");
ZipFile.ExtractToDirectory(file.FullName, extractFilesDirectory.FullName);
ProcessDirectory(extractFilesDirectory); //process extracted files.
}
}
}
public static int CountFiles(DirectoryInfo directoryInfo, int count)
{
foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
{
count = CountFiles(subdirectory, count);
}
foreach (var fileInfo in directoryInfo.GetFiles())
{
if (fileInfo.Extension != ".zip") //exclude zip files while counting.
count++;
}
return count;
}
public static void DeleteIntermediateFiles(DirectoryInfo directoryInfo)
{
foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
{
if (subdirectory.Name.EndsWith(".ExtractedFiles"))
{
Directory.Delete(subdirectory.FullName, true);
}
}
}
}
}