C# C语言中的文件搜索#

C# C语言中的文件搜索#,c#,C#,我制定了以下代码: string[] paths = GetFiles(dir).ToArray(); int numberOfFiles = paths.Length; int i = 0; while (i < numberOfFiles - 1) { scanfile(paths[i]); i++; } string[]path=GetFiles(dir).ToArray(); int numberOfFiles=path.Length; int i=0; whi

我制定了以下代码:

string[] paths = GetFiles(dir).ToArray();

int numberOfFiles = paths.Length;
int i = 0;
while (i < numberOfFiles - 1)
{
    scanfile(paths[i]);
    i++;
}
string[]path=GetFiles(dir).ToArray();
int numberOfFiles=path.Length;
int i=0;
while(i
对于GetFiles:

static IEnumerable<string> GetFiles(string path) {
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
    path = queue.Dequeue();
    try
    {
        foreach (string subDir in Directory.GetDirectories(path))
        {
            queue.Enqueue(subDir);
        }
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
    string[] files = null;
    try
    {
        files = Directory.GetFiles(path);
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
    if (files != null)
    {
        for (int i = 0; i < files.Length; i++)
        {
            yield return files[i];
        }
    }
}
}

public string scanfile(string path)
    {
        int offset = 0;
        int length = 0;
        byte[] buffer;
        var variable1 = new StringBuilder();

        FileInfo fi = new FileInfo(path);
        length = (int)fi.Length;


            using (var mmf1 = MemoryMappedFile.CreateFromFile(path,
                FileMode.OpenOrCreate, null, offset + length))
            {
                // Create reader to MMF
                using (var reader = mmf1.CreateViewAccessor(300,
                4000, MemoryMappedFileAccess.Read))
                {
                    // Read from MMF
                    buffer = new byte[4000];
                    reader.ReadArray<byte>(0, buffer, 0, 4000);
                }
            }

        return variable1.ToString();

    }
静态IEnumerable GetFiles(字符串路径){
队列=新队列();
queue.Enqueue(路径);
而(queue.Count>0)
{
path=queue.Dequeue();
尝试
{
foreach(Directory.GetDirectories(path)中的字符串subDir)
{
排队(subDir);
}
}
捕获(例外情况除外)
{
Console.Error.WriteLine(ex);
}
string[]files=null;
尝试
{
files=Directory.GetFiles(路径);
}
捕获(例外情况除外)
{
Console.Error.WriteLine(ex);
}
如果(文件!=null)
{
for(int i=0;i
注意:获取文件我也从堆栈溢出中获取了

但是,如果我对目录中的许多文件使用它,速度会非常慢,因为 首先计算目录中的文件


你能帮我优化这些代码吗

您应该使用foreach循环遍历GetFiles的结果,而不是将其作为数组获取,然后扫描单个文件。

好的,让我们看看是否可以将其简化一点。让我们使用以下代码获取所有文件:

// Get list of files in the specific directory.
// ... Please change the first argument.
string[] files = Directory.GetFiles("{root path}",
    "*.*",
    SearchOption.AllDirectories);
请注意,
AllDirectories
记录如下:

在搜索操作中包括当前目录及其所有子目录。此选项包括重新分析点,例如搜索中已安装的驱动器和符号链接

现在让我们使用一个简单的
foreach
循环来完成它们:

foreach (var file in files)
{
    // ... do something
}
这有什么不起作用的原因吗?

只要看看。他们的示例还介绍了如何迭代所有*.txt文件并获取包含Microsoft的所有行


该示例还通过跳过此文件来处理未经授权的访问异常。

该代码不仅“非常慢”-它将是无限的,因为您永远不会更改
i
numeriofiles
的值。这表明这不是您真正的代码,这使您很难进一步诊断问题。此外,您似乎没有显示
scanfile
GetFiles
的功能,以及为什么需要将其放入数组中?我建议您回答:您使用的是.NET的哪个版本?你能给线程一个scanfile()方法吗?可能是从线程池中?但是如果我使用foreach循环,它会出现一个错误“访问路径被拒绝”,我已经使用foreach方法很多次了。它运行良好,速度非常快!您正在调用不需要的ToArray方法。此外,迭代器有一些优化,这将使它稍微快一点。“访问路径被拒绝”错误与foreach循环无关。请确保您对尝试删除的文件拥有完全权限access@micheal显示代码。。Pastebin?如何获得完全权限?它不适用于错误:“拒绝访问路径”?!首先,它不是递归的,第二件事是,拒绝访问错误是文件系统问题,而不是代码问题。您无法使用代码解析它。您必须更改文件系统权限,或者以适当的用户权限运行代码,以便它可以访问所有文件。好的。所以,这是一个错误,因为我的电脑?如果我在另一台计算机上运行它,它会工作吗?@MurtuzaKabul,我不确定你怎么能表明它不是递归的。。。你真的做过原型吗?你是说微软的文档是一个彻头彻尾的谎言吗?@Michael,围绕权限错误的问题是因为你无权访问它试图搜索的目录之一。它可能是一个子目录,因为我假设您可以访问根目录。