1using System;
2using System.Collections;
3using System.IO;
4
5namespace TerraNova.PocketShArc
6{
7 /// <summary>
8 /// Espone tutti i files che sono in una specifica directory
9 /// (e in tutte le sottodirectory della directory stessa).
10 /// </summary>
11 /// <seealso cref="File" />
12 /// <seealso cref="FileInfo" />
13 public class FileEnumerator : IEnumerable, IEnumerator
14 {
15 // Memorizzo la directory di partenza, per le chiamate a IEnumerator.Reset
16 private readonly DirectoryInfo startDir = null;
17
18 // Contiene tutti i files in tutte le sottodirectory
19 private ArrayList files = null;
20
21 // Enumeratore ai singoli files
22 private IEnumerator ienum = null;
23
24 /// <summary>
25 /// inizializza una nuova istanza della classe<see cref="FileEnumerator"/>.
26 /// </summary>
27 public FileEnumerator(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">L'insieme è stato modificato dopo la creazione dell'enumeratore.</exception>
53 public void Reset()
54 {
55 files = null;
56
57 files = new ArrayList();
58
59 // Carico i files
60 SearchFiles(startDir);
61
62 ienum = files.GetEnumerator();
63 }
64
65 /// <summary>
66 /// Ottiene l'elemento <see cref="FileInfo" /> corrente dell'insieme.
67 /// </summary>
68 /// <value></value>
69 /// <exception cref="T:System.InvalidOperationException">
70 /// L'enumeratore è posizionato prima del primo elemento o dopo l'ultimo elemento dell'insieme.
71 /// </exception>
72 public object Current
73 {
74 get
75 {
76 return ienum.Current;
77 }
78 }
79
80 /// <summary>
81 /// Consente di spostare l'enumeratore all'elemento successivo dell'insieme.
82 /// </summary>
83 /// <returns>
84 /// <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.
85 /// </returns>
86 /// <exception cref="T:System.InvalidOperationException">L'insieme è stato modificato dopo la creazione dell'enumeratore.</exception>
87 public bool MoveNext()
88 {
89
90 return ienum.MoveNext();
91 }
92 #endregion
93 #region Metodi ...
94
95
96 private void SearchFiles(DirectoryInfo dirinfo)
97 {
98 files.AddRange(dirinfo.GetFiles());
99
100 foreach (DirectoryInfo nextdir in dirinfo.GetDirectories())
101 SearchFiles(nextdir);
102 }
103 #endregion
104 }
105}
106