带路径的文件> MAX_PATH并将二进制插入DB

时间:2012-08-30 16:21:34

标签: c# .net-4.0 sql-server-2008-r2

我通过一些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。有没有更优化的方法将这个二进制文件放入数据库?

1 个答案:

答案 0 :(得分:1)

在dwFlagsAndAttributes中传递FILE_FLAG_NO_BUFFERING标志。由于您一次性读取整个文件,因此不需要在本机Windows IO中构建缓冲,这会增加一些开销。不确定它能为你节省多少,但有时候每一点都有帮助。