예제 #1
0
        private IEnumerable <string> GetItemsInternal(string filter, DirectoryEnumerator.EnumerationType enumType, Predicate <NativeMethods.WIN32_FIND_DATA> extendedFilter = null)
        {
            string itemName;

            NativeMethods.WIN32_FIND_DATA findData;
            while (this.GetNextItem(filter, enumType, out itemName, out findData, extendedFilter))
            {
                yield return(itemName);
            }
            if (this.m_recurse)
            {
                foreach (string dir in this.m_realDirectories)
                {
                    string fullPath = Path.Combine(this.m_path.FullName, dir);
                    using (DirectoryEnumerator dirEnum = new DirectoryEnumerator(new DirectoryInfo(fullPath), this.m_recurse, this.m_includeRecycleBin))
                    {
                        foreach (string item in dirEnum.GetItemsInternal(filter, enumType, extendedFilter))
                        {
                            yield return(item);
                        }
                    }
                }
            }
            yield break;
        }
예제 #2
0
        private bool GetNextItem(string filter, DirectoryEnumerator.EnumerationType enumType, out string itemName, out NativeMethods.WIN32_FIND_DATA findData, Predicate <NativeMethods.WIN32_FIND_DATA> extendedFilter = null)
        {
            bool flag  = false;
            bool flag2 = false;

            itemName              = null;
            findData              = default(NativeMethods.WIN32_FIND_DATA);
            findData.FileName     = string.Empty;
            findData.FileSizeHigh = 0U;
            findData.FileSizeLow  = 0U;
            bool flag3;

            do
            {
                if (this.m_safeFindHandle == null)
                {
                    string fileName = Path.Combine(this.m_path.FullName, filter);
                    this.m_safeFindHandle = NativeMethods.FindFirstFile(fileName, out findData);
                    if (this.m_safeFindHandle == null || this.m_safeFindHandle.IsInvalid)
                    {
                        flag3 = false;
                        int lastWin32Error = Marshal.GetLastWin32Error();
                        if (lastWin32Error != 2)
                        {
                            this.ThrowIOException(lastWin32Error, "FindFirstFile");
                        }
                    }
                    else
                    {
                        flag3 = true;
                    }
                }
                else
                {
                    flag3 = NativeMethods.FindNextFile(this.m_safeFindHandle, out findData);
                    if (!flag3)
                    {
                        int lastWin32Error2 = Marshal.GetLastWin32Error();
                        if (lastWin32Error2 != 18)
                        {
                            this.ThrowIOException(lastWin32Error2, "FindNextFile");
                        }
                    }
                }
                if (flag3)
                {
                    if ((findData.FileAttributes & NativeMethods.FileAttributes.Directory) != NativeMethods.FileAttributes.None && !this.IsSpecialDirectoryName(findData.FileName) && (extendedFilter == null || extendedFilter(findData)))
                    {
                        flag2 = true;
                    }
                    switch (enumType)
                    {
                    case DirectoryEnumerator.EnumerationType.Files:
                        if ((findData.FileAttributes & NativeMethods.FileAttributes.Directory) == NativeMethods.FileAttributes.None && NativeMethods.PathMatchSpec(findData.FileName, filter))
                        {
                            flag = true;
                        }
                        break;

                    case DirectoryEnumerator.EnumerationType.Directories:
                        if (flag2)
                        {
                            flag = true;
                        }
                        break;

                    case DirectoryEnumerator.EnumerationType.FilesOrDirectories:
                        if (flag2)
                        {
                            flag = true;
                        }
                        else if ((findData.FileAttributes & NativeMethods.FileAttributes.Directory) == NativeMethods.FileAttributes.None && NativeMethods.PathMatchSpec(findData.FileName, filter))
                        {
                            flag = true;
                        }
                        break;
                    }
                    if (this.m_recurse && flag2)
                    {
                        this.m_realDirectories.Add(findData.FileName);
                    }
                    if (flag && extendedFilter != null && !extendedFilter(findData))
                    {
                        flag = false;
                    }
                }
            }while (flag3 && !flag);
            if (flag)
            {
                if (this.ReturnBaseNames)
                {
                    itemName = findData.FileName;
                }
                else
                {
                    itemName = Path.Combine(this.m_path.FullName, findData.FileName);
                }
            }
            else
            {
                this.ResetFindHandle();
            }
            return(flag);
        }
예제 #3
0
 private bool GetNextItem(string filter, DirectoryEnumerator.EnumerationType enumType, out string itemName)
 {
     NativeMethods.WIN32_FIND_DATA win32_FIND_DATA;
     return(this.GetNextItem(filter, enumType, out itemName, out win32_FIND_DATA, null));
 }