65.9K
CodeProject is changing. Read more.
Home

Zip archiving files after a cutoff date, but preserving directory structure

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3 votes)

Feb 13, 2012

CPOL
viewsIcon

10503

A small archiving utility

A basic little console app I threw together. You can simply drag a folder onto it to get it going. Great recursion example...

Uses the Ionic zip library for zip functions. (You will want to save the zip less often if dealing with large files.)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Ionic.Zip;

namespace MoveAndArchive
{
    class Program
    {
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">Arguments array.</param>
        static void Main(string[] args)
        {
            try
            {
                DirectoryInfo root;
                DateTime cutoff;
                ZipFile destZIP = new ZipFile(Directory.GetParent(
                    System.Reflection.Assembly.GetExecutingAssembly().Location) + 
                    @"\" + DateTime.Now.ToString("yyyy_MM_dd_HHmmss") + ".zip");

                if (args.Length > 0)
                {
                    root = new DirectoryInfo(args[0]);
                    Console.WriteLine("Source Directory: " + root.FullName);
                }
                else
                {
                    Console.Write("Enter Source Directory: ");
                    root = new DirectoryInfo(Console.ReadLine());
                }
                Console.Write("Enter a cutoff (last) date to copy files from (Enter for all): ");
                string cutoffString = Console.ReadLine();
                cutoff = (cutoffString == string.Empty ? DateTime.MaxValue : DateTime.Parse(cutoffString));
                MoveAll(destZIP, cutoff, root, root);
            }
            catch (Exception ex)
            {
                Console.WriteLine("\nERROR: " + ex.Message);
            }
            Console.WriteLine("\nCompleted.\n");
            Console.ReadKey();
        }

        /// <summary>
        /// Recursively move all files to local ZIP file.
        /// </summary>
        /// <param name="Zip">The ZIP file to write to.</param>
        /// <param name="Cutoff">The last modify-date of files to transfer.</param>
        /// <param name="Root">The root directory being read from.</param>
        /// <param name="Dir">The current directory.</param>
        static void MoveAll(ZipFile Zip, DateTime Cutoff, DirectoryInfo Root, DirectoryInfo Dir)
        {
            string zipPath = Dir.FullName.Replace(Root.FullName, string.Empty);
            if (zipPath != string.Empty)
            {
                Console.WriteLine("Directory: " + zipPath);
                Zip.AddDirectoryByName(zipPath);
            }

            FileInfo[] files = Dir.GetFiles();
            for (int i = 0; i < files.Length; i++)
            {
                if (files[i].LastWriteTime > Cutoff)  continue;
                Console.WriteLine(DateTime.Now.ToString() + " ZIP: " + files[i].FullName);
                Zip.AddFile(files[i].FullName, zipPath == string.Empty ? @"\" : zipPath);
                Zip.Save();
                File.Delete(files[i].FullName);
            }

            foreach (DirectoryInfo d in Dir.GetDirectories())  MoveAll(Zip, Cutoff, Root, d);
        }
    }
}