我通过一些P / Invoke拉了一个SafeFileHandle
。这是一个片段:
[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 server上有一个命令过程来执行插入操作。我目前正在将流的字节数组添加到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
。有没有更优化的方法将这个二进制文件放入数据库?
答案 0 :(得分:1)
在dwFlagsAndAttributes中传递FILE_FLAG_NO_BUFFERING标志。由于您一次性读取整个文件,因此不需要在本机Windows IO中构建缓冲,这会增加一些开销。不确定它能为你节省多少,但有时候每一点都有帮助。