2013-10-07 66 views
0

我在我的腦海中掙扎,因爲將來自DLL的大數據作爲ref byte複製到文件的最佳方式是什麼。
因爲它是一個視頻流(或數百),那麼我覺得在循環中使用Marhal.Copy/WriteByte並不舒服,等等,但更直接。
我很喜歡那個ref byte,不幸的是並沒有真正做這件事。
無論如何,我在想P/Invoke WriteFile,但它得到IntPtr哪裏最接近我可以從ref byte得到當然是byte*(使用fixed)。
現在,我將有幾百這種流,每個可以達到〜2Mbps。
所以在底線 - 我正在尋找一種有效的方式將ref byte塊複製到一個文件(當然有給定的數組大小)。複製大'ref字節'塊到文件

+0

你能不能用'System.IO.Stream'? – Aron

+0

這是過早優化的糟糕情況。除非機器具有大量的RAM,否則這些視頻流將快速飽和文件系統緩存。之後它只能像磁盤寫入一樣快。從Marshal.Copy()開銷根本就沒有關係。 –

+0

@HansPassant,我將這個Windows服務作爲Windows Server 2008計算機的目標,所以我希望磁盤速度在我的CPU之前成爲我的限制。複製每個緩衝區到託管代碼,然後從它那裏沖洗文件聽起來很可怕,它真的有這麼小的影響? 順便說一句,我很高興知道什麼是-1是 – RoeeK

回答

0

如果有人會感興趣,並感謝史密斯先生,我首先將給定的DllImport從ref byte聲明更改爲IntPtr
然後我進口WriteFile

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

,並用它如下:

//somewhere in class: 
tmpFileStream = new FileStream("tmp.bin", FileMode.Create, FileAccess.Write); 

public void AddBuffer(IntPtr buffer, int size) 
{ 
    int written; 
    WriteFile(tmpFileStream.SafeFileHandle.DangerousGetHandle(), buffer, size, out written, IntPtr.Zero); 
}