lnicola
6/26/2014 - 12:46 PM

ImageChecker.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Drawing;

namespace ImageChecker
{
	class Program
	{
		static void CheckImages(string path, StreamWriter log)
		{
			Console.WriteLine("Retrieving file list");
			var files = new List<string>();

			foreach (var file in Directory.EnumerateFiles(path, "*.jpg", SearchOption.AllDirectories))
				files.Add(file);
			var ev = new CountdownEvent(files.Count);
			Console.WriteLine("Checking {0} files", files.Count);
			ThreadPool.SetMaxThreads(4, 20);
			new Thread(new ThreadStart(() =>
				{
					foreach (var file in files)
					{
						ThreadPool.QueueUserWorkItem(s =>
						{
							var f = s as string;
							try
							{
								using (Image.FromFile(f)) ;
							}
							catch (OutOfMemoryException)
							{
								Console.WriteLine(f);
								lock (log)
								{
									log.WriteLine(f);
									log.Flush();
								}
							}
							catch (Exception ex)
							{
								Console.WriteLine("{0} for {1}", ex.Message, f);
								lock (log)
								{
									log.WriteLine("{0} for {1}", ex.Message, f);
									log.Flush();
								}
							}

							ev.Signal();
						}, file);
					}
				})).Start();

			while (!ev.IsSet)
			{
				ev.Wait(10000);
				Console.WriteLine("{0} files left", ev.CurrentCount);
			}
		}

		static void Main()
		{
			const string path = @"g:\pictures";

			using (var log = new StreamWriter("log.txt"))
				CheckImages(path, log);
		}
	}
}