2012-04-25 53 views
15

我有一個應用程序需要極少的持久性存儲。實際上,我們正在談論整數。所有應用程序的需求是在下一次啓動時知道這些整數(並且整數在運行時會改變)。C#.NET - 存儲一些非常小規模持久信息的方法?

一個數據庫對此是矯枉過正,但我​​並不特別想僅僅使用一個文本文件。

C#是否有任何機制來保持這樣的小值之間的運行?我注意到你可以在資源文件和其他地方存儲東西 - 我不知道你是否可以在運行時改變它們。我剛剛學習C#& NET新工作,所以如果這是一個愚蠢的問題,道歉!

+0

webforms,winforms,wpf,wp? – balexandre 2012-04-25 21:05:31

+0

一旦我弄清楚自己在做什麼,staright-up控制檯應用程序最終可能會變成一個windows服務。 – 2012-04-25 21:06:33

+2

然後,我會使用XML文件作爲.NET的文件存儲是偉大的或寫作和閱讀它,再加上你甚至可以使用Linq2Xml ... – balexandre 2012-04-25 21:08:42

回答

19

這裏是一個blurp of another SO後,介紹如何安裝應用程序設置,這是閱讀一個簡單的基於文件的解決方案/寫作價值。

如果你使用Visual Studio工作,那麼這是很容易得到持久化的設置。右鍵單擊Solution Explorer中的項目,選擇屬性,選擇設置選項卡,單擊超鏈接,如果不存在設置。使用設置選項卡創建應用程序設置Visual Studio創建Settings.settings和Settings.Designer.settings文件,其中包含從ApplicationSettingsBase繼承的單例類設置您可以通過代碼訪問此類以讀取/寫入應用程序設置:

Settings.Default["SomeProperty"] = "Some Value"; 
Settings.Default.Save(); // Saves settings in application configuration file 
+6

之一進行序列化**應用範圍**設置在運行時是隻讀的,**用戶範圍**設置是可讀寫的,但它們將被刪除他運行的每個過程 - 請參閱我的答案:http://stackoverflow.com/questions/10304665/saving-setting-to-a-exe/10305024#10305024 – balexandre 2012-04-25 21:16:12

+0

不錯,謝謝你的好評:) – 2012-04-25 23:12:17

6

我會使用embeeded sqlite數據庫。

http://www.codeproject.com/Articles/22165/Using-SQLite-in-your-C-Application

SQLite是一個小型的,快速和可嵌入的數據庫,其中數據庫引擎和接口被合併成一個單一的庫。它還能夠將所有數據存儲在單個文件中。因此,如果您的應用程序需要獨立的數據庫,SQLite可能是您的最佳選擇。當然,選擇SQLite還有其他一些原因,包括:

SQLite的內存佔用量小,訪問數據庫只需要一個庫,因此非常適合嵌入式數據庫應用程序。 SQLite已被移植到許多平臺,甚至可以在Windows CE和Palm OS上運行。 SQLite符合ACID標準,符合所有四項標準 - 原子性,一致性,隔離性和持久性。 SQLite實現了ANSI-92 SQL標準的一大部分,包括視圖,子查詢和觸發器。 沒有額外的數據庫驅動程序的問題,需要ODBC配置。只需在應用程序中包含庫和數據文件即可。 SQLite擁有C/C++,PHP,Perl,Python,Tcl等原生語言API .C#的Native API仍然不存在。

+0

+1爲好答案 - 我欣賞細節。實際上,我對SQLite非常熟悉並喜歡它 - 但它需要我獲得一個大的API幷包含大量的代碼,以便在比SQLite接口小得多的應用程序中存儲幾個整數,所以它可能也是矯枉過正的: (謝謝你的幫助:) – 2012-04-25 21:08:26

+0

只需30個整數,爲什麼不使用使用app.config?我現在看來更合乎邏輯了? – 2012-04-25 21:12:43

3

您可以將列表序列化爲一個xml文件。這是你如何保存:

var xs = new System.Xml.Serialization.XmlSerializer(typeof(List<int>)); 
List<int> ints = new List<int> { 1, 2, 3 }; 

using (FileStream fs = new FileStream(@"C:\store.xml", FileMode.OpenOrCreate)) 
{ 
    xs.Serialize(fs, ints); 
} 

和檢索它同樣簡單:

using (FileStream fs = new FileStream(@"C:\store.xml", FileMode.OpenOrCreate)) 
{ 
    ints = xs.Deserialize(fs) as List<int>; 
} 
+0

爲了將來的改進,最好將列表作爲字段 – st78 2012-04-25 21:13:37

2

我會選擇文件存儲a nd避免將數據庫或註冊表作爲第一個需要大量框架和第二個...

How does one parse XML files?

您可以創建文件來保存所有的ID在同一個:喔很好,從來沒有登記使用XML作爲文件存儲,這是一個偉大的閱讀玩:)

節點,或寫每個節點一個ID,它是你的,這樣的事情就可以了:

<?xml version="1.0" encoding="utf-8" ?> 
<settings> 
    <selected> 
     <id>1</id> 
     <id>8</id> 
     <id>12</id> 
     <id>15</id> 
    </selected> 
</settings> 

爲了創建這樣的文件:

XmlDocument doc = new XmlDocument(); 
    XmlElement set = (XmlElement)doc.AppendChild(doc.CreateElement("settings")); 
    XmlElement sel = (XmlElement)set.AppendChild(doc.CreateElement("selected")); 

    int[] selectedIds = new int[] { 1, 2, 3, 4, 5 }; 

    foreach (int id in selectedIds) 
    sel.AppendChild(doc.CreateElement("id")).InnerText = id.ToString(); 

    string path = Path.GetDirectoryName(Application.ExecutablePath); 
    doc.Save(path + "/settings.xml"); 

爲了閱讀,您可以使用XmlReaderXmlTextReaderXDocument,等...

2

如果您正在使用C#4.0及以上,你可能想看看新Memory Mapped Files

使用持久性內存映射文件將爲您提供文件的輕鬆性,但是可以將映射到內存的速度提供給您。你當然仍然必須自己管理文件格式。

  • 持久化的存儲器映射文件

持久化的文件是與一個磁盤上的源文件相關聯的存儲器映射的文件。當最後一個進程完成對文件的處理時,數據將被保存到磁盤上的源文件中。這些內存映射文件適用於處理非常大的源文件。

這可能對30個整數來說可能是矯枉過正,但這是另一種選擇,特別是如果速度很關鍵。