2012-04-25 20 views
15

Ho un'applicazione che necessiterà di una memoria estremamente piccola e persistente. Realisticamente, stiamo parlando di 30 interi <. Tutte le esigenze dell'applicazione è di conoscere questi numeri interi all'avvio successivo (e gli interi cambiano durante l'esecuzione).C#. NET - metodo per memorizzare alcune informazioni persistenti su scala molto piccola?

Un database è eccessivo per questo, ma in particolare non voglio usare solo un file di testo.

C# ha qualche meccanismo per mantenere piccoli valori come questo tra le esecuzioni? Ho notato che è possibile archiviare le cose nei file di risorse e in altri posti. Non so se è possibile cambiarli nel runtime. Sto solo imparando C# &. NET per un nuovo lavoro, quindi scuse se questa è una domanda stupida!

+0

webform, winforms, wpf, wp? – balexandre

+0

app della console staright-up che probabilmente cambierà in un servizio di Windows alla fine una volta capito cosa sto facendo. –

+2

Vorrei quindi archiviare i file utilizzando un file XML in quanto .NET è ottimo o scrive e legge da esso, inoltre puoi anche usare Linq2Xml ... – balexandre

risposta

19

Ecco un post blurp of another SO che spiega come impostare Impostazioni applicazione, si tratta di una soluzione semplice basata su file per la lettura/scrivere valori.

"Se si lavora con Visual Studio, allora è abbastanza facile da ottenere le impostazioni persistibili. clic destro del mouse sul progetto in Esplora soluzioni, scegliere Proprietà. Selezionare la scheda Impostazioni, fare clic sul collegamento ipertestuale, se non esiste impostazioni Utilizzare la scheda Impostazioni per creare le impostazioni dell'applicazione Visual Studio crea i file Settings.settings e Settings.Designer.settings che contengono la classe singleton Impostazioni ereditate da ApplicationSettingsBase È possibile accedere a questa classe dal proprio codice per leggere/scrivere le impostazioni dell'applicazione: "

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

** Ambito applicazione ** Le impostazioni sono di sola lettura in fase di runtime, ** Impostazioni ambito utente ** sono di lettura-scrittura ma verranno cancellate per ogni processo che esegue - vedere la mia risposta: http://stackoverflow.com/questions/10304665/saving-setting-to-a-exe/10305024#10305024 – balexandre

+0

Bello, e grazie per il buon commento :) –

6

Vorrei utilizzare il database sqlite incorporato.

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

SQLite è un piccolo, veloce e integrabile database in cui il motore di database e l'interfaccia sono combinati in una singola libreria. Ha anche la possibilità di memorizzare tutti i dati in un singolo file. Quindi, se la tua applicazione richiede un database standalone, SQLite è forse la scelta perfetta per te. Esistono, naturalmente, altri motivi per scegliere SQLite:

SQLite ha un ingombro di memoria ridotto e solo una singola libreria è necessaria per accedere ai database, rendendolo ideale per le applicazioni di database incorporate. SQLite è stato portato su molte piattaforme e funziona anche su Windows CE e Palm OS. SQLite è compatibile con ACID e soddisfa tutti e quattro i criteri: Atomicità, Consistenza, Isolamento e Durata. SQLite implementa un ampio sottoinsieme dello standard SQL ANSI-92, tra cui visualizzazioni, sottoquery e trigger. Nessun problema con driver di database aggiuntivi, è richiesta la configurazione ODBC. Basta includere la libreria e il file di dati con la tua applicazione. SQLite ha API native per C/C++, PHP, Perl, Python, Tcl ecc. L'API nativa per C# non è ancora presente.

+0

+1 per la buona risposta - Apprezzo il dettaglio. In realtà ho abbastanza familiarità con SQLite e mi piace - ma mi richiede di ottenere una grande API e includere un sacco di codice per salvare alcuni numeri interi in un'app significativamente più piccola dell'interfaccia SQLite, quindi probabilmente è anche eccessivo: (Grazie per l'aiuto però :) –

+0

Per soli 30 numeri interi, perché non usare app.config? Mi sembra più logico ora? –

3

Si potrebbe semplicemente serializzare l'elenco in un file xml. Questo è il modo di salvarlo:

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

e il recupero è altrettanto facile:

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

per miglioramenti futuri sarebbe meglio serializzare la classe con l'Elenco come uno di campo – st78

2

Vorrei scegliere l'archiviazione di file a Evita il database o il registro come prima cosa che serve per gran parte del framework e il secondo ...ohh bene, mai giocare con Registry :)

utilizzando XML come archiviazione di file questo è un grande letto:

How does one parse XML files?

è possibile creare il file da salvare tutti i ID di nello stesso nodo, o scrivere un ID per ogni nodo, tocca a voi, qualcosa di simile a questo sarebbe bene:

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

per creare questo file:

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

Per la lettura è possibile utilizzare XmlReader, XmlTextReader, XDocument, ecc ...

2

Se stai usando C# 4.0 e verso l'alto, si potrebbe desiderare di avere uno sguardo alla nuova Memory Mapped Files.

L'utilizzo di file di memoria persistente con mappatura offre la facilità di un file, ma la velocità della mappatura in memoria. Ovviamente dovresti ancora gestire il formato del file da solo.

  • file mappati in memoria persisteva

file persisteva sono file mappati in memoria che sono associati con un file sorgente su un disco. Quando l'ultimo processo ha finito di lavorare con il file, i dati vengono salvati sul file sorgente sul disco. Questi file mappati in memoria sono adatti per lavorare con file di origine estremamente grandi.

Probabilmente questo potrebbe essere eccessivo per 30 interi, ma è un'altra opzione, soprattutto se la velocità è la chiave.