1using System;
2using System.Collections;
3using System.IO;
4
5namespace TerraNova.PocketShArc
6{
7 /// <summary>
8 /// Espone tutte le sottodirectory che sono in una specifica directory.
9 /// Espone la directory stessa come primo elemento dell'enumerazione.
10 /// </summary>
11 /// <seealso cref="Directory" />
12 /// <seealso cref="DirectoryInfo" />
13 public class DirectoryEnumerator : IEnumerable, IEnumerator
14 {
15 // Memorizzo la directory di partenza, per le chiamate a IEnumerator.Reset
16 private readonly DirectoryInfo startDir = null;
17
18 // Contiene tutte le sottodirectory
19 private ArrayList dirs = null;
20
21 // Enumeratore alle singole directory
22 private IEnumerator ienum = null;
23
24 /// <summary>
25 /// inizializza una nuova istanza della classe<see cref="DirectoryEnumerator"/>.
26 /// </summary>
27 public DirectoryEnumerator(string dirPath)
28 {
29 if (!Directory.Exists(dirPath))
30 throw new ArgumentException("The specified directory not exists!", "dirPath");
31
32 startDir = new DirectoryInfo(dirPath);
33 Reset();
34 }
35 #region IEnumerable ...
36
37
38 /// <summary>
39 /// Viene restituito un enumeratore che può scorrere un insieme.
40 /// </summary>
41 /// <returns>
42 /// <see cref="T:System.Collections.IEnumerator"/> che può essere utilizzato per scorrere l'insieme.
43 /// </returns>
44 public IEnumerator GetEnumerator() { return this; }
45 #endregion
46 #region IEnumerator ...
47
48
49 /// <summary>
50 /// Imposta l'enumeratore sulla propria posizione iniziale, ovvero prima del primo elemento nell'insieme.
51 /// </summary>
52 /// <exception cref="T:System.InvalidOperationException">
53 /// L'insieme è stato modificato dopo la creazione dell'enumeratore.
54 /// </exception>
55 public void Reset()
56 {
57 dirs = null;
58 dirs = new ArrayList();
59
60 // Carico le directory
61 SearchDirs(startDir);
62
63 ienum = dirs.GetEnumerator();
64 }
65
66 /// <summary>
67 /// Ottiene l'elemento <see cref="DirectoryInfo" /> corrente dell'insieme.
68 /// </summary>
69 /// <value></value>
70 /// <exception cref="T:System.InvalidOperationException">
71 /// L'enumeratore è posizionato prima del primo elemento o dopo l'ultimo elemento dell'insieme.
72 /// </exception>
73 public object Current
74 {
75 get
76 {
77 return ienum.Current;
78 }
79 }
80
81 /// <summary>
82 /// Consente di spostare l'enumeratore all'elemento successivo dell'insieme.
83 /// </summary>
84 /// <returns>
85 /// <see langword="true"/> se l'enumeratore ha completato correttamente il passaggio all'elemento successivo; <see langword="false"/> se l'enumeratore ha raggiunto la fine dell'insieme.
86 /// </returns>
87 /// <exception cref="T:System.InvalidOperationException">L'insieme è stato modificato dopo la creazione dell'enumeratore.</exception>
88 public bool MoveNext()
89 {
90
91 return ienum.MoveNext();
92 }
93 #endregion
94 #region Metodi ...
95
96
97 private void SearchDirs(DirectoryInfo dirinfo)
98 {
99 dirs.Add(dirinfo);
100
101 foreach (DirectoryInfo nextdir in dirinfo.GetDirectories())
102 SearchDirs(nextdir);
103 }
104 #endregion
105 }
106}
107