C# - 如何以最快的方式将IntPtr缓冲区数据保存到文件?

12

我正在使用这段代码将非托管代码中的IntPtr缓冲区保存到文件中,以节省字节。 这是一个简单的回调函数:

private void callback(IntPtr buffer, int length)
{
    byte[] bytes = new byte[length];
    Marshal.Copy(buffer, bytes, 0, length);
    FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
    file.Write(bytes, 0, length);
    file.Close();
}

我想要的是将这些数据存储到文件中并丢弃它。据我所了解,非托管代码中有一个缓冲区,在我的代码中还有第二个缓冲区。我不想在这些缓冲区之间复制数据,而是直接使用它:

// bad:     (unmanaged) buffer -> (managed) bytes -> file
// awesome: (unmanaged) buffer ->                    file

我的任务需要最快的方式将数据存储到文件中。

2个回答

18

在 .NET 框架内保持,可能比使用对内核 DLL 的调用更好。

我会使用:

private void callback(IntPtr buffer, int length, String filename)
{
    try
    {
        FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
        UnmanagedMemoryStream ustream = new UnmanagedMemoryStream((byte*)buffer, length);
        ustream.CopyTo(file);
        ustream.Close();
        file.Close();
    }
    catch{/** To do: catch code **/}
}

6

这个技术被称为“managed”是有原因的 :-) 不过你可以使用P/Invoke 声明 WriteFile函数,如下:

private void callback(IntPtr buffer, int length)
{
    FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
    int written;
    WriteFile(file.Handle, buffer, length, out written, IntPtr.Zero);
    file.Close();
}

 [DllImport("kernel32.dll")]
 private static extern bool WriteFile(IntPtr hFile, IntPtr lpBuffer, int NumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接