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);
}
}
}