Поиск файлов с расширением .dcm на конкретном диске c # - PullRequest
0 голосов
/ 09 августа 2011

Я пытаюсь найти файлы с расширением .dcm, введя либо имя файла, либо содержимое файла.Я могу искать в каталоге, но когда я пытаюсь выполнить поиск на диске, я получаю сообщение об ошибке: отсутствует каталог или ссылка на сборку.

string startFolder = @"C:\";
// Take a snapshot of the file system.
System.IO.DriveInfo dir = new System.IO.DriveInfo(startFolder);

// This method assumes that the application has discovery permissions
// for all folders under the specified path.
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.
                                                               SearchOption.
                                                               AllDirectories);

Ответы [ 3 ]

3 голосов
/ 09 августа 2011

Попробуйте поискать на диске, как в папке, это работает:

    string startFolder = @"c:\";
    DirectoryInfo directoryInfo = new DirectoryInfo(startFolder);
    IEnumerable<System.IO.FileInfo> fileList = directoryInfo.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
0 голосов
/ 09 августа 2011

Используйте эту рекурсивную функцию, чтобы избежать исключений:

public static IEnumerable<string> GetFiles(string path, string pattern)
{
    IEnumerable<string> result;
    try
    {
        result = Directory.GetFiles(path, pattern);
    }
    catch (UnauthorizedAccessException)
    {
        result = new string[0];
    }

    IEnumerable<string> subDirectories;
    try
    {
        subDirectories = Directory.EnumerateDirectories(path);
    }
    catch (UnauthorizedAccessException)
    {
        subDirectories = new string[0];
    }

    foreach (string subDirectory in subDirectories)
    {
        IEnumerable<string> subFiles = GetFiles(subDirectory, pattern);
        result = result.Concat(subFiles); //This is LINQ concatenation
    }
    return result;
}

static void Main(string[] args)
{ 
    string startFolder = @"c:\";
    foreach (string fileName in GetFiles(startFolder, "*.chm"))
    {
        Console.WriteLine(fileName);
    }
0 голосов
/ 09 августа 2011

Вы можете немедленно отфильтровать все файлы с расширением * .dcm

string startFolder = @"c:\";
DirectoryInfo directoryInfo = new DirectoryInfo(startFolder);
IEnumerable<System.IO.FileInfo> fileList = directoryInfo.GetFiles("*.dcm", System.IO.SearchOption.AllDirectories);

После этого используйте цикл foreach, чтобы найти файл с нужным именем или открыть файл для чтения и поиска значения.внутри файла.

Являются ли * .dcm текстовыми файлами или двоичными файлами?Если это текстовые файлы, вы можете использовать выражение regulare, чтобы выяснить, существует ли строка поиска.

РЕДАКТИРОВАТЬ: Вот пример рекурсивной функции, которая выполняет эту работу.Это консольное приложение, поэтому адаптируйте его под свои нужды:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace FileSearcher
{
    class Program
    {
        static string searchValue = "Windows";
        static List<FileInfo> files = new List<FileInfo>();

        static void Main(string[] args)
        {
            string startFolder = @"C:\";
            DirectoryInfo diParent = new DirectoryInfo(startFolder);

            FindSearchValue(diParent);

            foreach (var file in files)
            {
                Console.WriteLine("{0}", file.FullName);
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadLine();
        }


        /// <summary>
        /// Recursive function that searches for a file that matches the criteria.
        /// If the file is not found, the current file is opened and it's contents is 
        /// scanned for search value.
        /// </summary>
        /// <param name="diParent">Current parent folder being searched.</param>
        private static void FindSearchValue(DirectoryInfo diParent)
        {
            FileInfo[] foundFiles = diParent.GetFiles("*.doc");

            foreach (var file in foundFiles)
            {
                Console.WriteLine(file.FullName);

                if (file.FullName.Contains(searchValue)) // There is a search string in a file name
                {
                    files.Add(file);
                }
                else
                {
                    string fileContents = File.ReadAllText(file.FullName);

                    if (fileContents.Contains(searchValue)) // Here you can use Regex.IsMatch(fileContents, searchValue)
                    {
                        files.Add(file);
                    }
                }
            }

            foreach (var diChild in diParent.GetDirectories())
            {
                try
                {
                    FindSearchValue(diChild);
                }
                catch (Exception exc)
                {
                    Console.WriteLine("ERROR: {0}", exc.Message);
                }
            }
        }
    }
}

Эта функция использует блок try-catch для перехвата исключений, которые могут возникнуть.Например, файл не найден или доступ запрещен.Надеюсь, это поможет!

...