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