-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: Get Files 私も 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

をご覧くださいDirectory.EnumerateFiles。これらは、すべての *.txt ファイルを反復処理し、Microsoftを含むすべての行を取得する方法の例でもあります。

この例では、このファイルを単純にスキップすることで、不正アクセスの例外にも対処しています。

于 2012-10-01T14:13:44.363 に答える
1

配列としてフェッチしてから個々のファイルをスキャンするのではなく、foreach ループを使用して GetFiles の結果を反復処理する必要があります。

于 2012-10-01T13:37:34.977 に答える