Introduced a concept of folder depth in the database code, and updated the Snapshot class to take advantage of it. Only working for a 'OneLevel' Folder Group type.
This commit is contained in:
+108
-76
@@ -18,6 +18,8 @@ namespace DataOrganizer
|
||||
private Dictionary<string, DB.FolderGroup> FolderGroups { get; } = new Dictionary<string, DB.FolderGroup>();
|
||||
private string CurrentNamingPattern { get; set; } = string.Empty;
|
||||
private ContextMenu PrimaryTreeContextMenu { get; set; } = new ContextMenu(); //Copy to default new content location, set new naming rules etc..
|
||||
private Snapshot ActiveSnapshotForPrimaryTree { get; set; }
|
||||
private Dictionary<string, TreeNode> PrimaryTreeNodes { get; set; } = new Dictionary<string, TreeNode>();
|
||||
|
||||
public FileViewer()
|
||||
{
|
||||
@@ -34,10 +36,22 @@ namespace DataOrganizer
|
||||
|
||||
ProfileComboBox.SelectedIndexChanged += ProfileComboBox_SelectedIndexChanged;
|
||||
RootFolderComboBox.SelectedIndexChanged += SelectedFolderComboBox_SelectedIndexChanged;
|
||||
PrimaryFilesTreeView.NodeMouseClick += PrimaryFilesTreeView_NodeMouseClick;
|
||||
|
||||
ProfileComboBox.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
private void PrimaryFilesTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
|
||||
{
|
||||
if(ActiveSnapshotForPrimaryTree.Files.ContainsKey(e.Node.Name))
|
||||
{
|
||||
var file = ActiveSnapshotForPrimaryTree.Files[e.Node.Name];
|
||||
|
||||
FileDetailsNameLabel.Text = $"Name: {file.Name}";
|
||||
FileDetailsFullPathLabel.Text = $"Full Path: {file.PathNoRoot}";
|
||||
}
|
||||
}
|
||||
|
||||
private void SelectedFolderComboBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
var db = new DB();
|
||||
@@ -47,14 +61,25 @@ namespace DataOrganizer
|
||||
var profile = Profiles[ProfileComboBox.Text];
|
||||
|
||||
PrimaryFilesTreeView.Nodes.Clear();
|
||||
PrimaryTreeNodes.Clear();
|
||||
|
||||
var files = db.GetFilesForProfileByFolderGroup(profile.Id, folderGroup.Id);
|
||||
var snapshot = new Snapshot(files, profile, folderGroup);
|
||||
ActiveSnapshotForPrimaryTree = new Snapshot(files, profile, folderGroup);
|
||||
|
||||
foreach(var folder in snapshot.Root.Folders)
|
||||
foreach(var folder in ActiveSnapshotForPrimaryTree.Root.Folders)
|
||||
{
|
||||
PrimaryFilesTreeView.Nodes.Add(GetNodeFromSnapshot(folder));
|
||||
}
|
||||
|
||||
//var count = 1;
|
||||
|
||||
//foreach(var file in ActiveSnapshotForPrimaryTree.FileDuplicates)
|
||||
//{
|
||||
// PrimaryTreeNodes[file.Value.File.PathNoRoot].Text = $"{count} ) {file.Value.File.Name}";
|
||||
// PrimaryTreeNodes[file.Value.Duplicates[0].PathNoRoot].Text = $"{count} ) {file.Value.Duplicates[0].Name}";
|
||||
|
||||
// count++;
|
||||
//}
|
||||
}
|
||||
|
||||
private TreeNode GetNodeFromSnapshot(KeyValuePair<string, Folder> folder)
|
||||
@@ -65,6 +90,7 @@ namespace DataOrganizer
|
||||
foreach(var f in folder.Value.Folders)
|
||||
{
|
||||
var folderNode = GetNodeFromSnapshot(f);
|
||||
//PrimaryTreeNodes.Add(f.Key, folderNode);
|
||||
node.Nodes.Add(folderNode);
|
||||
if (folderNode.ForeColor == Color.Orange)
|
||||
{
|
||||
@@ -76,13 +102,17 @@ namespace DataOrganizer
|
||||
foreach(var file in folder.Value.Files)
|
||||
{
|
||||
var fileNode = new TreeNode(file.Value.Name) { Name = file.Key, ToolTipText = file.Key };
|
||||
//PrimaryTreeNodes.Add(file.Key, fileNode);
|
||||
|
||||
if (!regex.IsMatch(file.Value.Name)) fileNode.ForeColor = Color.Orange;
|
||||
|
||||
node.Nodes.Add(fileNode);
|
||||
node.ForeColor = fileNode.ForeColor;
|
||||
if(node.ForeColor != Color.Orange) node.ForeColor = fileNode.ForeColor;
|
||||
PrimaryTreeNodes.Add(file.Key, fileNode);
|
||||
}
|
||||
|
||||
PrimaryTreeNodes.Add(folder.Key, node);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
@@ -91,6 +121,7 @@ namespace DataOrganizer
|
||||
var profile = Profiles[ProfileComboBox.Text];
|
||||
|
||||
RootFolderComboBox.Items.Clear();
|
||||
PrimaryTreeNodes.Clear();
|
||||
FolderGroups.Clear();
|
||||
|
||||
if (profile.FolderGroups.Count > 0)
|
||||
@@ -132,83 +163,84 @@ namespace DataOrganizer
|
||||
|
||||
private void ScanRootFolderButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
var folder = FolderGroups[RootFolderComboBox.Text];
|
||||
//var db = new DB();
|
||||
//var pattern = db.GetNamingPatternById(folder.PatternId);
|
||||
//var regex = new Regex(pattern);
|
||||
//PrimaryFilesTreeView.Nodes.Clear();
|
||||
var folderGroup = GetActiveFolderGroup();
|
||||
var rootDepth = folderGroup.Path.Split(new char[] { Path.DirectorySeparatorChar }).Length;
|
||||
var newFiles = new List<FileInfo>();
|
||||
var rootFolder = new DirectoryInfo(folderGroup.Path);
|
||||
|
||||
//var dirs = Directory.EnumerateDirectories(folder.Path);
|
||||
foreach (var dir in rootFolder.EnumerateDirectories()) newFiles.AddRange(ScanDirectory(dir));
|
||||
|
||||
//foreach (var dir in dirs)
|
||||
//{
|
||||
// var dirInfo = new DirectoryInfo(dir);
|
||||
// PrimaryFilesTreeView.Nodes.Add(CreateNode(dirInfo, pattern));
|
||||
//}
|
||||
|
||||
//foreach(var file in Directory.EnumerateFiles(folder.Path))
|
||||
//{
|
||||
// var fileInfo = new FileInfo(file);
|
||||
// var fileNode = new TreeNode(fileInfo.Name) { Name = fileInfo.FullName };
|
||||
|
||||
// if (!regex.IsMatch(fileInfo.Name))
|
||||
// {
|
||||
// fileNode.ForeColor = Color.DarkOrange;
|
||||
// }
|
||||
|
||||
// PrimaryFilesTreeView.Nodes.Add(fileNode);
|
||||
//}
|
||||
|
||||
WriteFilesToDb(folder.Path);
|
||||
}
|
||||
|
||||
private TreeNode CreateNode(DirectoryInfo dir, string pattern)
|
||||
{
|
||||
var folder = FolderGroups[RootFolderComboBox.Text];
|
||||
var profile = Profiles[ProfileComboBox.Text];
|
||||
var namingViolation = false;
|
||||
var node = new TreeNode(dir.Name) { Name = dir.FullName };
|
||||
var regex = new Regex(pattern);
|
||||
var db = new DB();
|
||||
|
||||
var files = Directory.EnumerateFiles(dir.FullName);
|
||||
|
||||
foreach (var file in files)
|
||||
foreach (var file in rootFolder.EnumerateFiles())
|
||||
{
|
||||
var fileInfo = new FileInfo(file);
|
||||
var fileNode = new TreeNode(fileInfo.Name) { Name = fileInfo.FullName };
|
||||
//var match = regex.Match(fileInfo.Name);
|
||||
//var stringBuilder = new StringBuilder();
|
||||
|
||||
//if (!match.Groups[1].Success)
|
||||
// stringBuilder.Append($"Failed to match {regex.GroupNameFromNumber(1)} ");//match.Groups[0].Name}");
|
||||
//if (!match.Groups[2].Success)
|
||||
// stringBuilder.Append($"Failed to match {regex.GroupNameFromNumber(2)} ");
|
||||
|
||||
if (!regex.IsMatch(fileInfo.Name))
|
||||
if (!ActiveSnapshotForPrimaryTree.Files.ContainsKey(file.FullName))
|
||||
{
|
||||
namingViolation = true;
|
||||
fileNode.ForeColor = Color.DarkOrange;
|
||||
newFiles.Add(file);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var newFile in newFiles)
|
||||
{
|
||||
var folders = newFile.DirectoryName.Split(new char[] { Path.DirectorySeparatorChar });
|
||||
var currentPath = folderGroup.Path;
|
||||
|
||||
for(var i = rootDepth; i < folders.Length; i++)
|
||||
{
|
||||
var previousPath = currentPath;
|
||||
currentPath = Path.Combine(currentPath, folders[i]);
|
||||
|
||||
if(!PrimaryTreeNodes.ContainsKey(currentPath))
|
||||
{
|
||||
var node = new TreeNode(folders[i]) { ForeColor = Color.Blue, ToolTipText = currentPath };
|
||||
PrimaryTreeNodes[currentPath] = node;
|
||||
if (previousPath == folderGroup.Path)
|
||||
{
|
||||
PrimaryFilesTreeView.Nodes.Add(node);
|
||||
}
|
||||
else
|
||||
{
|
||||
PrimaryTreeNodes[previousPath].Nodes.Add(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
node.Nodes.Add(fileNode);
|
||||
db.InsertNewFileRecord(GetFileSnapshots(dir.FullName), profile.Id, folder.Id, folder.Path);
|
||||
PrimaryTreeNodes[currentPath].Nodes.Add(new TreeNode(newFile.Name) { ForeColor = Color.Blue });
|
||||
}
|
||||
|
||||
if (namingViolation) node.ForeColor = Color.DarkOrange;
|
||||
|
||||
var dirs = Directory.EnumerateDirectories(dir.FullName);
|
||||
|
||||
foreach(var f in dirs)
|
||||
{
|
||||
var child = CreateNode(new DirectoryInfo(f), pattern);
|
||||
node.ForeColor = child.ForeColor;
|
||||
node.Nodes.Add(child);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
private List<FileInfo> ScanDirectory(DirectoryInfo dir)
|
||||
{
|
||||
var newFiles = new List<FileInfo>();
|
||||
|
||||
foreach (var d in dir.EnumerateDirectories())
|
||||
{
|
||||
UpdateStatusStrip($"Processing {d.FullName}");
|
||||
newFiles.AddRange(ScanDirectory(d));
|
||||
}
|
||||
|
||||
foreach(var file in dir.EnumerateFiles())
|
||||
{
|
||||
if (!ActiveSnapshotForPrimaryTree.Files.ContainsKey(file.FullName))
|
||||
{
|
||||
newFiles.Add(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO: check for modifications
|
||||
}
|
||||
}
|
||||
|
||||
foreach(var file in ActiveSnapshotForPrimaryTree.Files)
|
||||
{
|
||||
UpdateStatusStrip($"Checking for the existance of {file.Value.Name}");
|
||||
|
||||
if(File.Exists(file.Key))
|
||||
{
|
||||
//TODO: mark this file as deleted. Also scan the folders.
|
||||
}
|
||||
}
|
||||
|
||||
return newFiles;
|
||||
}
|
||||
private void WriteFilesToDb(string root)
|
||||
{
|
||||
var dir = new DirectoryInfo(root);
|
||||
@@ -241,8 +273,8 @@ namespace DataOrganizer
|
||||
private List<DB.FileSnapshot> GetFileSnapshots(string path)
|
||||
{
|
||||
var dir = new DirectoryInfo(path);
|
||||
var profile = GetCurrentProfile();
|
||||
var folderGroup = GetCurrentFolderGroup();
|
||||
var profile = GetActiveProfile();
|
||||
var folderGroup = GetActiveFolderGroup();
|
||||
|
||||
var snapshots = new List<DB.FileSnapshot>();
|
||||
|
||||
@@ -250,7 +282,7 @@ namespace DataOrganizer
|
||||
{
|
||||
snapshots.Add(new DB.FileSnapshot
|
||||
{
|
||||
FullPath = file.FullName,
|
||||
PathNoRoot = file.FullName,
|
||||
Name = file.Name,
|
||||
CreationDate = file.CreationTimeUtc,
|
||||
ModifiedDate = file.LastWriteTimeUtc,
|
||||
@@ -264,12 +296,12 @@ namespace DataOrganizer
|
||||
return snapshots;
|
||||
}
|
||||
|
||||
private DB.Profile GetCurrentProfile()
|
||||
private DB.Profile GetActiveProfile()
|
||||
{
|
||||
return Profiles[ProfileComboBox.Text];
|
||||
}
|
||||
|
||||
private DB.FolderGroup GetCurrentFolderGroup()
|
||||
private DB.FolderGroup GetActiveFolderGroup()
|
||||
{
|
||||
return FolderGroups[RootFolderComboBox.Text];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user