2012-12-03 62 views
8

我正在使用此代碼將非託管代碼中的IntPtr緩衝區中的字節保存到文件中。這是一個簡單的回調函數:C# - 如何將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 

對於我的任務,我需要存儲的數據文件中最快捷的方式。

回答

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); 
9

在.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 **/} 
} 
+1

這稱之爲是「過時」一個你在你的答案說什麼? –

相關問題