我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 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
. 有没有更优化的方法将此二进制文件放入数据库?