2016-03-31 86 views
1

我正在處理一個大文件(8 GB)通過內存映射文件(C#MemoryMappedFile)。我想能夠將內容放入WPF網格(例如數據網格),但我遇到麻煩,因爲似乎工作的每種方法都必須將文件加載到內存中,這會破壞內存映射文件。內存映射文件到WPF網格

我知道一個wpf數據網格只能訪問需要的數據,但我如何將它鏈接到內存映射文件,以便我只能請求正在查看的字節而不必將整個內容放入內存中。

我一直希望有一個像DataGrid.itemsource = file這樣簡單的方法,但看起來並不是這樣。

我的最終目標是加載這個大文件並顯示文件的字節,如十六進制編輯器。任何人都有一個使用內存映射文件的例子,或者只是從用戶正在查看的文件中讀取字節。

+0

爲什麼要使用DataGrid?你會在列中顯示什麼? – Evk

+0

這些列將是動態的,以創建字節行。類似於大多數十六進制編輯器 – user6141665

回答

0

我會盡力給你一個關於如何完成這個任務的高級概述。您將需要UI虛擬化和數據虛擬化。您在默認DataGrid(VirtualizingStackPanel)中免費獲得UI虛擬化,對於數據虛擬化您必須使用自定義解決方案(例如:https://alphachitech.wordpress.com/2015/01/31/virtualizing-observable-collection/)。每個項目都會代表1MB的原始數據,因此總共有大約8000個此類項目在您的網格中。最初,這些項目中沒有一個實際包含數據。當用戶向下滾動到文件的該部分時,數據僅從內存映射文件中讀取(請參閱上面的數據虛擬化)。這將允許用戶滾動整個8GB文件,就像它在內存中加載一樣,而真正的1MB塊將在滾動時加載和卸載。

+0

這正是我所需要的。我遵循他們的例子,我能夠以最小的影響顯示大文件(10-20MB) – user6141665

+0

這正是我所需要的。我遵循他們的例子,我能夠以最小的影響顯示大文件(10-20MB) – user6141665