/// <summary> /// Sets the enumerator to its initial position, which is before the first element in the collection. /// </summary> /// <exception cref="T:System.InvalidOperationException"> /// The collection was modified after the enumerator was created. /// </exception> public void Reset() { m_hndFindFile = null; }
/// <summary> /// Advances the enumerator to the next element of the collection. /// </summary> /// <returns> /// true if the enumerator was successfully advanced to the next element; /// false if the enumerator has passed the end of the collection. /// </returns> /// <exception cref="T:System.InvalidOperationException"> /// The collection was modified after the enumerator was created. /// </exception> public bool MoveNext() { bool retval = false; //If the handle is null, this is first call to MoveNext in the current // directory. In that case, start a new search. if (m_currentContext.SubdirectoriesToProcess == null) { if (m_hndFindFile == null) { new FileIOPermission(FileIOPermissionAccess.PathDiscovery, m_path).Demand(); string searchPath = Path.Combine(m_path, m_filter); m_hndFindFile = NativeMethods.FindFirstFile(searchPath, m_win_find_data); retval = !m_hndFindFile.IsInvalid; } else { //Otherwise, find the next item. retval = NativeMethods.FindNextFile(m_hndFindFile, m_win_find_data); } } //If the call to FindNextFile or FindFirstFile succeeded... if (retval) { if (((FileAttributes)m_win_find_data.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory) { //Ignore folders for now. We call MoveNext recursively here to // move to the next item that FindNextFile will return. return(MoveNext()); } } else if (m_searchOption == SearchOption.AllDirectories) { //SearchContext context = new SearchContext(m_hndFindFile, m_path); //m_contextStack.Push(context); //m_path = Path.Combine(m_path, m_win_find_data.cFileName); //m_hndFindFile = null; if (m_currentContext.SubdirectoriesToProcess == null) { string[] subDirectories = Directory.GetDirectories(m_path); m_currentContext.SubdirectoriesToProcess = new Stack <string>(subDirectories); } if (m_currentContext.SubdirectoriesToProcess.Count > 0) { string subDir = m_currentContext.SubdirectoriesToProcess.Pop(); m_contextStack.Push(m_currentContext); m_path = subDir; m_hndFindFile = null; m_currentContext = new SearchContext(m_path); return(MoveNext()); } //If there are no more files in this directory and we are // in a sub directory, pop back up to the parent directory and // continue the search from there. if (m_contextStack.Count > 0) { m_currentContext = m_contextStack.Pop(); m_path = m_currentContext.Path; if (m_hndFindFile != null) { m_hndFindFile.Close(); m_hndFindFile = null; } return(MoveNext()); } } return(retval); }