SafeFileHandle
P/Invoke 経由でプルしました。ここにスニペットがあります:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern SafeFileHandle CreateFile(
string lpFileName,
EFileAccess dwDesiredAccess,
EFileShare dwShareMode,
IntPtr lpSecurityAttributes,
ECreationDisposition dwCreationDisposition,
EFileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile);
次に、ハンドルを非常に簡単につかむことができます。
SafeFileHandle fileHandle = CreateFile(path, EFileAccess.GenericRead, EFileShare.None, IntPtr.Zero,ECreationDisposition.OpenExisting, 0, IntPtr.Zero);
System.IO.File
文字列パスのみを受け取り、260 文字を超える完全修飾パスをサポートする必要があるため、これを行う必要がありますMAX_PATH
。
とにかく、挿入を実行するためにSQLサーバーにコマンドプロシージャがあります。現在、ストリームのバイト配列を列に追加していvarbinary(max)
ます (私のファイルのほとんどは 2MB 未満なので、filestream
行く価値はないようです)。
私は現在、次のようにコマンドパラメータを入力しています:
using (FileStream s = new FileStream(fileHandle, FileAccess.Read))
{
byte[] buf = new byte[s.Length];
s.Read(buf, 0, Convert.ToInt32(s.Length));
cmd.Parameters.AddWithValue("@File", buf);
}
File.ReadAllBytes
よりも小さいファイルパスで使用できる通常と比較して、本当に遅いようですMAX_PATH
。このバイナリを DB に入れるより最適な方法はありますか?