-5

我做了这个代码:

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

int numberOfFiles = paths.Length;
int i = 0;
while (i < numberOfFiles - 1)
{
    scanfile(paths[i]);
    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();

    }

PS:获取文件我也是从 Stack Overflow 中获取的。

但是,如果我将它用于目录中的许多文件,它会非常慢,因为它首先计算目录中的文件。

你能帮我优化这些代码吗?

4

3 回答 3

2

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

// 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
}

有没有理由这不起作用?

于 2012-10-01T13:47:27.237 回答
1

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

于 2012-10-01T13:37:34.977 回答
1

简单地看看Directory.EnumerateFiles。他们也是如何遍历所有 *.txt 文件并获取包含Microsoft的所有行的示例。

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

于 2012-10-01T14:13:44.363 回答