0

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

4

1 回答 1

1

在 dwFlagsAndAttributes 中传递 FILE_FLAG_NO_BUFFERING 标志。由于您是一次性读取整个文件,因此不需要内置于原生 Windows IO 中的缓冲,并且会增加一点开销。不确定它会为您节省多少,但有时每一点都会有所帮助。

于 2012-08-30T16:53:36.063 回答