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メソッドはありますか?この制限を回避するためのヒントはありますか?