Ejemplo n.º 1
0
        /// <summary>
        /// Gets <see cref="FastFileInfo"/> for all the files in a directory that match a specific filter.
        /// </summary>
        /// <param name="path">The path to search.</param>
        /// <param name="searchPattern">The search string to match against files in the path. Multiple can be specified separated by the pipe character.</param>
        /// <returns>An list of FastFileInfo objects that match the specified search pattern.</returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="path"/> is a null reference (Nothing in VB)
        /// </exception>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="filter"/> is a null reference (Nothing in VB)
        /// </exception>
        public static IList <FastFileInfo> GetFiles(String path, String searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly)
        {
            List <FastFileInfo> list = new List <FastFileInfo>();

            String[]  arr = searchPattern.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            Hashtable ht  = (arr.Length > 1 ? new Hashtable() : null); // don't need to worry about case since it should be consistent

            foreach (String sp in arr)
            {
                String sp2 = sp.Trim();
                if (sp2.Length == 0)
                {
                    continue;
                }

                IEnumerable <FastFileInfo> e = EnumerateFiles(path, sp2, searchOption);
                if (ht == null)
                {
                    list.AddRange(e);
                }
                else
                {
                    var e2 = e.GetEnumerator();
                    if (ht.Count == 0)
                    {
                        while (e2.MoveNext())
                        {
                            FastFileInfo f = e2.Current;
                            list.Add(f);
                            ht[f.FullName] = f;
                        }
                    }
                    else
                    {
                        while (e2.MoveNext())
                        {
                            FastFileInfo f = e2.Current;
                            if (!ht.Contains(f.FullName))
                            {
                                list.Add(f);
                                ht[f.FullName] = f;
                            }
                        }
                    }
                }
            }

            return(list);
        }
Ejemplo n.º 2
0
 private void EnumerateFiles(string dir, string searchPattern, Channel <string> channel)
 {
     try
     {
         var sw = new SpinWait();
         //foreach (var file in Directory.EnumerateFiles(dir, searchPattern))
         foreach (var file in FastFileInfo.EnumerateFiles(dir, searchPattern))
         {
             while (!channel.Writer.TryWrite(file.FullName))
             {
                 sw.SpinOnce();
             }
         }
     }
     catch (UnauthorizedAccessException)
     {
     }
 }