Il modo migliore per salvare le impostazioni dell'applicazione

17

In Windows il modo predefinito è registro. Ciò ti consente di differenziare le impostazioni a livello di sistema e per utente.

In Unix dovresti usare i file di testo nella cartella / etc per le impostazioni del sistema (qual è la convenzione per le impostazioni per utente?).

Molti nuovi programmi (e specialmente quelli progettati per essere portatili) utilizzano file XML.

  • Qual è il modo migliore (e la posizione) per archiviare le impostazioni non BLOB?
  • Dovremmo seguire ogni impostazione predefinita di sistema o disporre di una soluzione unificata?
  • E qual è il modo migliore portatile ?
posta Wizard79 15.09.2010 - 17:50
fonte

10 risposte

24

What's the best way (and location) to store non-BLOB settings?

Su Windows, sembra accettabile utilizzare il registro. A mio parere, il registro era un sistema poco congegnato e preferibilmente un semplice file di testo nella directory Users\Username\AppData . È più facile eseguire il backup, meno pericoloso per gli utenti da modificare e più facile da pulire.

Su Linux e la maggior parte degli Unix, la posizione preferita è /home/user/.config/appname per le impostazioni specifiche dell'utente e /etc/ per le impostazioni globali (a livello di sistema). La posizione meno preferita (ma accettabile) per le impostazioni utente è ~/.appname , ma questo generalmente non va a posto. Questi file dovrebbero essere modificabili dall'utente, quindi un formato leggibile dall'uomo è sempre preferito.

Non sono d'accordo con la maggior parte delle persone sul fatto che XML sia un formato accettabile per la memorizzazione di dati non blob. È, a mio parere, un formato esagerato e eccessivamente complesso per ciò che di solito finisce con l'essere frammenti di dati strutturati molto piccoli. Preferisco vedere i file in YAML, JSON, ASN.1, coppie nome = valore o formati simili. Avere troppe sintassi rende troppo facile per un utente fare confusione e lasciare il file in un formato non valido.

Should we follow each system default or have a unified solution?

Tutto dipende da te, ma tieni a mente alcune cose:

  • Piattaforme come * nix hanno limitazioni rigorose su quali posizioni sono scrivibili. Più rigido di Windows. Così:
    • L'unico posto dove scrivere a qualsiasi cosa è nella directory home dell'utente.
    • Salvo la tua applicazione è un servizio di sistema; in tal caso, tutti i file di dati mutabili devono essere scritti in /var/ . I file di dati non modificabili devono essere conservati nella directory dell'app in /usr/share/ o /usr/local/share/ o /opt/
    • I file di configurazione in /etc/ dovrebbero mai essere scritti dall'applicazione quando è in esecuzione, anche se ha accesso in scrittura ad essi. /etc/ dovrebbe essere il repository per i comportamenti default e nient'altro.
    • Pianifica l'installazione della tua applicazione in tre posizioni: /usr/local/ , /opt/appname o /home/username/appname .
    • I Blob devono essere archiviati insieme ad altri file di configurazione se devono essere modificati. generalmente preferibile per usare un formato modificabile dall'utente, quindi è preferibile qualcosa come SQLite o Berkeley DB (poiché ci sono strumenti da riga di comando per ciascuno), ma non richiesti.
  • Su Windows, le tue applicazioni dovrebbero scrivere sempre nella directory User. La posizione standard per i file di dati è Users\User\AppData . In nessun altro posto sembra accettabile.
  • Su Mac OS X, le impostazioni dell'applicazione devono essere memorizzate in ~/Library/Preferences insieme a tutti i file plist delle altre applicazioni. plist sembra essere il formato preferito, ma ti consigliamo di ricontrollare le linee guida Apple.

And what's the best portable way?

Non c'è "il migliore", per essere onesti. Esistono solo limitazioni e aspettative specifiche della piattaforma. La mia raccomandazione è di attenermi a mezzi specifici della piattaforma, anche se ciò significa scrivere più codice.

    
risposta data 15.09.2010 - 19:16
fonte
8

In Windows, usa %APPDATA%\appname . Sotto * NIX, usa ~/.appname . Non utilizzare nomi di directory fissi su entrambe le piattaforme, poiché la directory home dell'utente può essere diversa da quella predefinita (potrebbe essere sulla rete, ad esempio).

Per quanto riguarda il formato, usa quello che pensi sia il migliore. Questa è una decisione che solo tu puoi fare nel contesto della tua applicazione. Non è necessario, e anzi, sconsigliabile, avere un modo "standard" di farlo, se quel modo "standard" non è ciò che è meglio per il tuo particolare programma.

Ad esempio, XML / JSON potrebbe essere un buon metodo per archiviare dati / configurazione utente se l'applicazione utilizza già XML / JSON per qualcos'altro. Ma se si tratta di un semplice file di configurazione, perché aggiungere bloat alla tua app introducendo una dipendenza? In questo caso, probabilmente è meglio usare semplicemente un semplice file di testo con var: value\n righe.

EDIT: non esiste un "migliore" metodo portatile, dal momento che i sistemi operativi utilizzano convenzioni molto diverse per questo. Non infrangere gli standard OS senza una maledetta buona ragione.

EDIT2: se ti trovi a creare un'impostazione a livello di sistema in /etc o HKEY_LOCAL_MACHINE , chiediti se l'impostazione è veramente globale. Quindi attendi 5 minuti e chiediti di nuovo. Se la risposta è ancora sì, allora con tutti i mezzi, fai un'impostazione globale. Ricorda che un utente normale non ha accesso in scrittura a /etc o HKEY_LOCAL_MACHINE e, facendo ciò, stai assicurando che qualcuno senza i diritti di amministratore non possa installare la tua app.

    
risposta data 15.09.2010 - 18:28
fonte
3

Cerco di tenere fuori il registro, è modo usato. Auguro a tutti.

Mi piace conservare i file di configurazione xml o un file bin o occasionalmente un database locale (SQLite).

    
risposta data 15.09.2010 - 17:56
fonte
3

La mia risposta è una combinazione di risposta e BioBuckyBall's answer .

XML / Json per configurazioni semplici, SQLite per configurazioni complesse e di grandi dimensioni parcheggiate nella cartella delle applicazioni del sistema operativo predefinito o nella cartella utente del sistema operativo predefinito quando le configurazioni dipendono dall'utente. Entrambi potrebbero essere usati.

    
risposta data 15.09.2010 - 18:53
fonte
2

In Windows, manterrei l'impostazione dell'applicazione nella cartella AppData

    
risposta data 15.09.2010 - 17:57
fonte
1

Le impostazioni utente di solito sono in

/home/<user>/.<application> 

Quindi, ad esempio, per le impostazioni di irssi è /home//.irssi/config

    
risposta data 15.09.2010 - 17:55
fonte
1

Penso che sia meglio usare il meccanismo specifico della piattaforma preferito. Ad esempio, su OS X, il meccanismo preferito è posizionare un elenco di proprietà in ~ / Library / Preferences e l'API Cocoa ha un'interfaccia davvero semplice per archiviare e recuperare le impostazioni da lì.

Se la tua app è multipiattaforma, puoi estrapolarla con una classe o qualcosa del genere.

    
risposta data 09.10.2010 - 17:07
fonte
0

L'unica cosa che scrivo nel registro è la posizione dell'app, in modo che installatori e updaters possano trovarla facilmente. Tutto il resto è memorizzato in file in / AppData / Company / App

    
risposta data 15.09.2010 - 20:24
fonte
-2

Per le app Java penso che gson sia una buona scelta. Crea i tuoi oggetti delle impostazioni e usa gson per convertirli in JSON e viceversa. Ha il vantaggio di essere leggibile dall'uomo invece di un blob serializzato.

Modifica: ok, quindi forse non è così generale ...

    
risposta data 15.09.2010 - 18:09
fonte
-2

Se stai scrivendo in .NET, puoi usare System.Environment.SpecialFolders per scoprire quali posizioni delle cartelle è possibile utilizzare per salvare la configurazione o anche alcuni dati.

    
risposta data 15.09.2010 - 19:49
fonte

Leggi altre domande sui tag