我正在使用此代码将非托管代码中的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
对于我的任务,我需要以最快捷的方式将数据存储到文件中。
答案 0 :(得分:9)
保持在.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 **/}
}
答案 1 :(得分:3)
嗯,出于某种原因,它被称为“托管”:-) 您可以做的是使用WriteFile声明P/Invoke,如下所示:
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);