/
FileSystemTree.cs
147 lines (136 loc) · 3.94 KB
/
FileSystemTree.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyLibrary
{
namespace FileSystemExt
{
using System.IO;
public class FileSystemTree
{
private FileSystemTreeNode _root;
public FileSystemTree(string root)
{
_root = new FileSystemTreeNode(root, null);
}
void CreateTree(FileSystemTreeNode rootNode)
{
IEnumerable<string> dirs = Directory.EnumerateDirectories(rootNode.Name);
foreach (var dir in dirs)
{
var dirTempNode = new FileSystemTreeNode( dir, rootNode );
rootNode.AddNode(dirTempNode);
CreateTree(dirTempNode);
}
IEnumerable<string> files = Directory.EnumerateFiles(rootNode.Name);
foreach (var file in files)
{
rootNode.AddNode(new FileSystemTreeNode(file, rootNode));
}
}
FileSystemTree GetDiferent(FileSystemTree otherTree, Diferent flags)
{
if (_root.Name != otherTree._root.Name)
{
return this;
}
FileSystemTree returnTree = new FileSystemTree(_root.Name)
{_root = GetDiferent(_root, otherTree._root, flags)};
return returnTree;
}
FileSystemTreeNode GetDiferent(FileSystemTreeNode thisTreeNode, FileSystemTreeNode otherTreeNode, Diferent flags)
{
FileSystemTreeNode returnNode = null;
bool isDid = false;
if (otherTreeNode == null)
{
if (flags.HasFlag(Diferent.Deleted))
{
return new FileSystemTreeNode(thisTreeNode.Name.FullName, null);
isDid = true;
}
else
{
throw new Exception("otherTreeNode == null");
}
}
if (thisTreeNode == null)
{
if (flags.HasFlag(Diferent.LastCreated))
{
return returnNode = new FileSystemTreeNode(otherTreeNode.Name.FullName, null);
isDid = true;
}
else
throw new Exception("ThisTreeNode == null");
}
returnNode = new FileSystemTreeNode(thisTreeNode.Name.FullName, null);
foreach (var child in thisTreeNode.Children)
{
FileSystemTreeNode tempNode = GetDiferent(child.Value, otherTreeNode.Children[child.Key], flags);
if (tempNode != null)
returnNode.AddNode(tempNode);
}
if (returnNode.Children.Count == 0)
returnNode = null;
else
{
isDid = true;
}
if (flags.HasFlag(Diferent.Deleted) && !isDid)
if (!File.Exists(otherTreeNode.Name.FullName) && (!Directory.Exists(otherTreeNode.Name.FullName)))
{
returnNode = new FileSystemTreeNode(otherTreeNode.Name.FullName, null);
isDid = true;
}
if (flags.HasFlag(Diferent.LastModified) && !isDid)
{
if (thisTreeNode.Name.LastWriteTime > otherTreeNode.Name.LastWriteTime)
{
returnNode = new FileSystemTreeNode(thisTreeNode.Name.FullName, null);
isDid = true;
}
else if (thisTreeNode.Name.LastWriteTime < otherTreeNode.Name.LastWriteTime)
{
returnNode = new FileSystemTreeNode(otherTreeNode.Name.FullName, null);
isDid = true;
}
}
if (flags.HasFlag(Diferent.LastCreated) && !isDid)
{
if (thisTreeNode.Name.CreationTime > otherTreeNode.Name.CreationTime)
{
returnNode = new FileSystemTreeNode(thisTreeNode.Name.FullName, null);
isDid = true;
}
else if (thisTreeNode.Name.CreationTime < otherTreeNode.Name.CreationTime)
{
returnNode = new FileSystemTreeNode(otherTreeNode.Name.FullName, null);
isDid = true;
}
}
return returnNode;
}
public static FileSystemTree GetFileSystemTree(string root)
{
FileSystemTree returnNode = new FileSystemTree(root);
returnNode.CreateTree(returnNode._root);
return returnNode;
}
[Flags]
public enum Diferent
{
None = 0,
LastModified = 0x02,
LastCreated = 0x04,
Deleted = 0x06
}
public static FileSystemTree GetDiferent(FileSystemTree first, FileSystemTree second, Diferent flags )
{
FileSystemTree returnTree = new FileSystemTree( first._root.Name.FullName );
return returnTree.GetDiferent( second, flags );
}
}
}
}