0

SafeFileHandleP/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 に入れるより最適な方法はありますか?

4

1 に答える 1

1

dwFlagsAndAttributesでFILE_FLAG_NO_BUFFERINGフラグを渡します。ファイル全体を一度に読み取るため、ネイティブWindows IOに組み込まれているバッファリングは不要であり、少しのオーバーヘッドが追加されます。どれだけ節約できるかはわかりませんが、少しでも役立つ場合があります。

于 2012-08-30T16:53:36.063 に答える