【问题标题】:Searching for files with a .dcm extension in a particular drive c#在特定驱动器 c# 中搜索扩展名为 .dcm 的文件
【发布时间】:2011-10-23 01:32:33
【问题描述】:

我正在尝试通过输入文件名或文件内容来搜索扩展名为 .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);

【问题讨论】:

  • 只想指出,由于您正在搜索*.dcm 文件,您可以将searchPattern 更改为"*.dcm" 而不是"*.*"

标签: c# visual-studio-2008 search directory


【解决方案1】:

尝试在驱动器中搜索它的工作原理:

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

【讨论】:

  • 嗨,当我这样做时,我收到此错误:访问路径“C:\System Volume Information”被拒绝。
  • 好的。在这种情况下,您应该自己实现递归算法并捕获 sequrity 异常。让我看看能不能给你找到一个代码 sn-p。
【解决方案2】:

使用这个递归函数来避免异常:

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);
    }

【讨论】:

  • 嗨,当我这样做时,我收到一条错误消息,提示 System.IO.Directory 不包含“EnumerateDirectories”的定义。当我检查这个时,它说我需要 .NET 4 版本我有.NET 3.0。接下来我能做什么?谢谢。
  • 尝试改用“GetDirectories()”。
【解决方案3】:

您可以立即过滤掉所有带有 *.dcm 扩展名的文件

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

然后使用 foreach 循环查找具有所需名称的文件或打开文件进行读取并搜索文件内的值。

*.dcm 是基于文本的文件还是二进制文件?如果它们是基于文本的文件,您可以使用正则表达式来确定搜索字符串是否存在。

编辑:这是完成这项工作的示例递归函数。它是一个控制台应用程序,因此请根据您的需要进行调整:

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 块来拦截可能发生的异常。例如,找不到文件或拒绝访问。希望这会有所帮助!

【讨论】:

  • 嗨,当我这样做时,我得到了同样的错误:访问路径“C:\System Volume Information”被拒绝。 .dcm 是 IMA 文件。
  • 看看我的编辑。按照您认为合适的方式修改它。在递归函数中将 *.txt 更改为 *.dcm。如果需要,请对其进行优化。享受吧。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2023-03-28
相关资源
最近更新 更多