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

我正在使用此代码将非托管代码中的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(); } 

我想要的是将这些数据存储到文件中并将其丢弃。 根据我的理解,非托管代码中有一个缓冲区,MY代码中有第二个缓冲区。 我不想复制我想要的数据:

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

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

好吧,由于某些原因,它被称为“托管”:-)你可以做的虽然是使用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); 

保持在.NET框架内可能比使用内核dll调用更好。

我会用:

 private void callback(IntPtr buffer, int length, Stirng 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 **/} }