private static void DoFsSnapshot(DirectoryInfo baseDirectory, DirectoryInfo currentDirectory, LinkedList<SnapshotFilesystemItem> results)
{
// Self
SnapshotDirectoryInfo current = new SnapshotDirectoryInfo();
current.RelativePath = currentDirectory.FullName.Substring(baseDirectory.FullName.Length);
try
{
current.LastAccess = currentDirectory.LastAccessTimeUtc;
current.LastModified = currentDirectory.LastWriteTimeUtc;
current.Attributes = (System.IO.FileAttributes)currentDirectory.Attributes;
current.WasReadable = true;
}
catch (System.IO.IOException)
{
// Couldn't read details
current.WasReadable = false;
}
// Subfiles
try
{
FileInfo[] files = currentDirectory.GetFiles();
foreach (FileInfo fileInfo in files)
{
// Single file
SnapshotFileInfo file = new SnapshotFileInfo();
file.RelativePath = fileInfo.FullName.Substring(baseDirectory.FullName.Length);
try
{
file.LastAccess = fileInfo.LastAccessTimeUtc;
file.LastModified = fileInfo.LastWriteTimeUtc;
file.Attributes = (System.IO.FileAttributes)fileInfo.Attributes;
// Make hash
using (System.IO.FileStream fileStream = fileInfo.OpenRead())
{
byte[] hash = _md5.ComputeHash(fileStream);
file.Hash = BitConverter.ToString(hash).Replace("-", "");
}
file.WasReadable = true;
}
catch (Exception)
{
// Couldn't read details
file.WasReadable = false;
}
results.AddLast(file);
}
}
catch (System.IO.IOException)
{
// Couldn't read files
current.WasReadable = false;
}
catch (UnauthorizedAccessException)
{
// Couldn't read files
current.WasReadable = false;
}
// Subdirs
try
{
DirectoryInfo[] directories = currentDirectory.GetDirectories();
foreach (DirectoryInfo directoryInfo in directories)
{
DoFsSnapshot(baseDirectory, directoryInfo, results);
}
}
catch (System.IO.IOException)
{
// Couldn't read directories
current.WasReadable = false;
}
catch (UnauthorizedAccessException)
{
// Couldn't read files
current.WasReadable = false;
}
results.AddLast(current);
}