5

そのため、コンピューター上の重複ファイルをスキャンするプログラムを作成しています。これまでに見たプログラムは非常に遅く、および/またはメモリを大量に消費しますが、PathTooLongExceptionドライブ全体を試してみるとエラーが発生しました。C# コードで PathTooLongException を読んだ後、次の 2 つの質問に興味を持ちました。

  1. レベルを変更するたびに現在のディレクトリを切り替えると、パフォーマンスが低下しますか?

  2. すべてのファイルのディレクトリ構造を取得するより良い方法はありますか (おそらく、tree.exe のようなものを呼び出して解析することによって)?

4

3 に答える 3

3

このライブラリを参照してください。

.NET Base Class Libraries : Long Path

于 2012-05-23T07:56:43.033 に答える
1

または自分で行う、

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern IntPtr FindFirstFile(string lpFileName, out
                                WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern bool FindNextFile(IntPtr hFindFile, out
                                WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool FindClose(IntPtr hFindFile);

// Assume dirName passed in is already prefixed with \\?\
public static IEnumerable<string> EnumerateEntries(string directory)
{ 
    WIN32_FIND_DATA findData;
    IntPtr findHandle = FindFirstFile(dirName + @"\*", out findData);

    try
    {
        if (findHandle != INVALID_HANDLE_VALUE)
        {
            bool found;
            do
            {
                string currentFileName = findData.cFileName;

                // if this is a directory, find its contents
                if (((int)findData.dwFileAttributes &
                                FILE_ATTRIBUTE_DIRECTORY) != 0)
                {
                    if (currentFileName != "." && currentFileName != "..")
                    {
                        foreach(var child in FindFilesAndDirs(
                                Path.Combine(dirName, currentFileName))
                        {
                            yield return child;
                        }
                    }
                }

                yield return Path.Combine(dirName, currentFileName);

                // find next
                found = FindNextFile(findHandle, out findData);
            }
            while (found);
        }

    }
    finally
    {
        // close the find handle
        FindClose(findHandle);
    }
}

私はこのコードを検証しておらず、明らかにすべての型が定義されているわけではありませんが、正しい方向を示しているはずです。

于 2014-11-18T16:03:34.587 に答える