Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Поиск файлов


Автор: Grigorill 14.8.2011, 09:04
Здравствуйте подскажите, как осуществить поиск файлов по части названия? То есть например вводим "новая" и он выводит все папки и файлы содержащие эти слова.У меня получилось сделать поиск по названию но необходимо вводить полное название включая расширение, а это неприемлемо.Подскажите пожалуйста может у кого есть статьи или примеры, заранее спасибо.

Автор: elena1212 14.8.2011, 09:55
Если имя файла - объект класса string, то можно применить метод int string.IndexOf(string Value), который возвращает индекс первого вхождения value в текущем объекте, например:
Код

using System.IO;

        public void Find(DirectoryInfo DrInfo, string fname)
        {
            if (DrInfo.Name.IndexOf(fname)>-1)
                listBox1.Items.Add(DrInfo.FullName);
            FileInfo[] Fi = DrInfo.GetFiles();
            for (int i = 0; i < Fi.Length; i++)
                if (Fi[i].Name.IndexOf(fname)>-1) // если fname входит в Fi[i].Name, то IndexOf вернет позицию >= 0 
                    listBox1.Items.Add(Fi[i].FullName);
            DirectoryInfo[] folder = DrInfo.GetDirectories();
            for (int j = 0; j < folder.Length; j++)
                Find(folder[j],fname);
        }

                   
        private void button1_Click(object sender, EventArgs e)
        {
            DirectoryInfo Dir = new DirectoryInfo("C:\\Папка");
            Find(Dir, "Новая");
        }
 
Если нужен поиск без учета регистра, то нужно перед вызовом IndexOf строку и подстроку привести к одному регистру

Автор: Grigorill 14.8.2011, 10:47
Спасибо огромное.

Автор: Fortnox 14.8.2011, 20:25
Можно так:
Код

        static IList<string> Find(IList<string> items, string value)
        {
            return items.Where(x => x.Contains(value)).ToList();
        }

        static void GetDirContent(string dir, IList<string> content)
        {
            var dirInfo = new DirectoryInfo(dir);

            //dirs 
            foreach (var d in dirInfo.GetDirectories())
            {
                content.Add(d.Name);
                GetDirContent(d.FullName, content);
            }

            // files
            foreach (var file in dirInfo.GetFiles())
                content.Add(file.Name);
        }

Использование:
Код

        static void Main(string[] args)
        {
            var content = new List<String>();
            GetDirContent(@"D:\Обмен", content);
            var findResult = Find(content, "1");

            foreach (var match in findResult)
                Console.WriteLine(match);

            Console.ReadLine();
        }

Автор: Grigorill 17.8.2011, 13:36
Fortnox  Спасибо за пример.Подскажите пожалуйста  как вернуть например в Listview помимо имени файла размер? Я пытался  создать так но не вышло.Заранее спасибо.
 
Код

 public IList<string> Find(IList<string> items,List<string> length, string value)
        {
           
                return items.Where(x => x.Contains(value)).ToList();
            
            
        }
        public List<string> Find2( List<string> length,string value)
        {

            return length;


        }
        
        public void GetDirContent(string dir, IList<string> content,List<string> length)
   {
    try
    {
        var dirInfo = new DirectoryInfo(dir);
         
        foreach (var d in dirInfo.GetDirectories())
        {
            content.Add(d.Name);
            GetDirContent(d.FullName, content,length);
        }
       
        foreach (FileInfo file in dirInfo.GetFiles())
        {
            
           
            content.Add(file.FullName);
            length.Add(file.Length.ToString());
            
        }
        }
    catch (UnauthorizedAccessException) {
        return;
    }
  }
        public void Main()
        {
            string na = textBox2.Text;
            string pa = textBox1.Text;
            var content = new List<String>();
            var length = new List<String>();
            GetDirContent(pa, content,length);
            var findResult = Find(content,length, na);
            var findlength = Find2(length,na);
            foreach (var match in findResult)
            {
                ListViewItem i = new ListViewItem(match);
                foreach (var le in findlength)
                {
                    i.SubItems.Add(le);
                }
                listView1.Items.Add(i);
            }
        }


Автор: Fortnox 18.8.2011, 11:45
Прилагаю пример.

Автор: Grigorill 18.8.2011, 19:58
Вот это да, Спасибо огромное!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)