0

win32 api(kernel32のDllImport)をList<string>介して再帰を介してファイルを取得します。FileFinderEx(これがどのように行われるかについては、いくつかの質問があります)。

MAX_PATHを使用するよりも、完全修飾パスを処理します。\\?\UNC\\\?\

また、win32 apiから、を介してファイルの「ショートパス」(8.3名)を取得できますGetShortPathNameW

List<string>ファイルへの完全修飾パスができたので、各パスを繰り返し処理して、SHA256別のリスト(同じインデックス)に配置します。大まかに言うと、次のようなものです。

List<string> files = new List<string>();
//win api function populates files ...
List<string> hash = new List<string>();
for (int i = 0; i < files.Count; i++)
{
    using (var stream = new BufferedStream(File.OpenRead(files[i]), 1200000))
    {
        SHA256Managed sha = new SHA256Managed();
        byte[] checksum = sha.ComputeHash(stream);
        hash.Add(BitConverter.ToString(checksum).Replace("-", String.Empty));
        stream.Close();
    }
}

私が直面している問題は、「ショートパス」(8.3名)を指定しても、完全修飾UNC名が(260)File.OpenReadより大きい場合は常に例外をスローすることです。MAX_PATH

んで、どうする?代わりに読み取りを行うためにインポートできるwin32api関数はありFile.OpenReadますか?または、長いファイルパスを持つファイルを開くための他の.NETメソッドはありますか?この制限を回避するためのヒントはありますか?

4

1 に答える 1

2

CreateFilekernel32.dllの関数を見てください。その名前にもかかわらず、それを使用してファイルの読み取りまたは作成を行うことができ、Unicode バージョンではMAX_PATH.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern SafeFileHandle CreateFile(
    string lpFileName,
    EFileAccess dwDesiredAccess,
    EFileShare dwShareMode,
    IntPtr lpSecurityAttributes,
    ECreationDisposition dwCreationDisposition,
    EFileAttributes dwFlagsAndAttributes,
    IntPtr hTemplateFile);

数年前から BCL チームのブログに、Windows と .NET の長いパスのトピックを扱った一連の記事 (パート 1はこちら) があり、役に立つと思います。

于 2012-08-28T20:57:45.993 に答える