-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathEnumerator.cs
More file actions
85 lines (76 loc) · 2.27 KB
/
Enumerator.cs
File metadata and controls
85 lines (76 loc) · 2.27 KB
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
//Copyright 2010 Lucemia Chen
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
using System;
using System.Collections.Generic;
using System.IO;
namespace NTFSDirect
{
public class Enumerator : IEnumerable<string>
{
//volume is "c:" format (no quotes)
//extensions is "new [] {".txt", ".md"}" format
public Enumerator(string volume, string[] extensions = null)
{
_volume = volume;
if (extensions != null) _extensions = new HashSet<string>(extensions);
}
private string _volume;
private HashSet<string> _extensions = null;
public int Count { get {
Init();
return _files.Values.Count;
}}
private Dictionary<ulong, NTFSDirect.FileEntry> _files = null;
private Dictionary<ulong, NTFSDirect.FileEntry> _folders = null;
private void Init()
{
if (_files != null) { return; }
var ntfs = new NTFSDirect.Volume();
ntfs.EnumerateVolume(_volume, _extensions, out _files, out _folders);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<string> GetEnumerator()
{
Init();
List<string> path = new List<string>(); //path fragment collector
foreach(NTFSDirect.FileEntry f in _files.Values)
{
path.Clear();
NTFSDirect.FileEntry p = f;
int dp = -1; //max path length counter to avoid inifinte loops
do {
if (p.ParentFrn != 0) {
path.Add(p.Name);
}
if (_files.ContainsKey(p.ParentFrn)) {
p = _files[p.ParentFrn];
} else if (_folders.ContainsKey(p.ParentFrn)) {
p = _folders[p.ParentFrn];
} else {
p = null;
}
} while(p != null && ++dp < 1000);
if (path.Count != 0)
{
path.Reverse();
string file = _volume+'\\'+Path.Combine(path.ToArray());
yield return file;
}
}
}
}
}