Index: /trunk/eraser6/Eraser.Util/VolumeInfo.cs
===================================================================
--- /trunk/eraser6/Eraser.Util/VolumeInfo.cs	(revision 1843)
+++ /trunk/eraser6/Eraser.Util/VolumeInfo.cs	(revision 1865)
@@ -727,5 +727,5 @@
 			{
 				if (i > 100)
-					throw new IOException("Could not lock volume.");
+					throw Win32ErrorCode.GetExceptionForWin32Error(Marshal.GetLastWin32Error()));
 				System.Threading.Thread.Sleep(100);
 			}
Index: /trunk/eraser6/Eraser.DefaultPlugins/FileSystems/Fat.cs
===================================================================
--- /trunk/eraser6/Eraser.DefaultPlugins/FileSystems/Fat.cs	(revision 1802)
+++ /trunk/eraser6/Eraser.DefaultPlugins/FileSystems/Fat.cs	(revision 1865)
@@ -87,30 +87,38 @@
 				}
 
-				using (VolumeLock volumeLock = info.LockVolume(stream))
+				try
 				{
-					while (eraseQueue.Count != 0)
+					using (VolumeLock volumeLock = info.LockVolume(stream))
 					{
-						if (callback != null)
-							callback(directoriesCleaned, directoriesCleaned + eraseQueue.Count);
+						while (eraseQueue.Count != 0)
+						{
+							if (callback != null)
+								callback(directoriesCleaned, directoriesCleaned + eraseQueue.Count);
 
-						FatDirectoryBase currentDir = api.LoadDirectory(eraseQueue[0].FullName);
-						eraseQueue.RemoveAt(0);
+							FatDirectoryBase currentDir = api.LoadDirectory(eraseQueue[0].FullName);
+							eraseQueue.RemoveAt(0);
 
-						//Queue the subfolders in this directory
-						foreach (KeyValuePair<string, FatDirectoryEntry> entry in currentDir.Items)
-							if (entry.Value.EntryType == FatDirectoryEntryType.Directory)
-							{
-								//Check that we don't have the same cluster queued twice (e.g. for
-								//long/8.3 file names)
-								if (eraseQueueClusters.Contains(entry.Value.Cluster))
-									continue;
+							//Queue the subfolders in this directory
+							foreach (KeyValuePair<string, FatDirectoryEntry> entry in currentDir.Items)
+								if (entry.Value.EntryType == FatDirectoryEntryType.Directory)
+								{
+									//Check that we don't have the same cluster queued twice (e.g. for
+									//long/8.3 file names)
+									if (eraseQueueClusters.Contains(entry.Value.Cluster))
+										continue;
 
-								eraseQueueClusters.Add(entry.Value.Cluster);
-								eraseQueue.Add(entry.Value);
-							}
+									eraseQueueClusters.Add(entry.Value.Cluster);
+									eraseQueue.Add(entry.Value);
+								}
 
-						currentDir.ClearDeletedEntries();
-						++directoriesCleaned;
+							currentDir.ClearDeletedEntries();
+							++directoriesCleaned;
+						}
 					}
+				}
+				catch (SharingViolationException e)
+				{
+					Logger.Log(S._("Could not erase directory entries on the volume {0} because" +
+						"the volume is currently in use."));
 				}
 			}
