2010-09-07 23 views
8

Possiedo un eseguibile portatile che salva i dati in un file nella stessa cartella dell'eseguibile. C'è un modo per salvare i dati nell'eseguibile stesso quando chiudo l'app?Salva dati in eseguibile

Questo forse strano, ma prendendo i dati con me e solo un file per l'exe e dati sarebbe grande.

Preferirei se questo è stato fatto con C#, ma non è un requisito.

risposta

3

Non è possibile modificare il proprio EXE per contenere i dati memorizzati in qualsiasi cosa si avvicini ad un modo elegante o compatto. Prima di tutto, il sistema operativo ottiene un blocco sul file EXE mentre viene eseguita l'applicazione contenuta all'interno. In secondo luogo, un EXE viene precompilato (almeno in MSIL) e la modifica dei dati sorgente del file richiede in genere la ricompilazione per reimpostare vari puntatori agli handle del codice, oppure una conoscenza SERIALE a un livello molto esoterico su ciò che si sta facendo per il file.

I metodi generalmente accettati sono il file di configurazione dell'applicazione, un file di risorse o un file personalizzato che si crea/legge/modifica in fase di esecuzione, come si fa ora. Due file per un'applicazione non dovrebbero essere motivo di preoccupazione

+0

Sì, so che non è male come è, ma con i Mac puoi copiare l'eseguibile, che è anche una cartella, e tutte le tue informazioni vanno con te. Sembra solo un piccolo dettaglio, ma vorrei metterlo al lavoro. –

1

Quindi adesso stai utilizzando un file app.config (e Settings.settings)? Credo che questo sia il modo più compatto per salvare i dati vicino all'exe.

Dubito fortemente che è possibile modificare il manifest di .exe, o qualsiasi altra parte di esso.

Edit: A quanto pare, ci potrebbero essere alcuni modi dopo tutti: http://www.codeproject.com/KB/msil/reflexil.aspx

2

È possibile, riservando lo spazio attraverso i mezzi di utilizzare una risorsa di stringa e pad fuori. Devi fare un po 'di lavoro investigativo per scoprire esattamente dove si trova l'offset dell'eseguibile in cui desideri riversare i dati, ma fai attenzione, il file sarà "in uso", quindi procedi con cautela.

+0

Vedi questo altro post ho fatto eoni fa ... http://stackoverflow.com/questions/1780260/write-a-value-into -pe-file/1780360 # 1780360 – t0mm13b

1

C'è un modo per utilizzare più flussi, ma funziona solo nei filesystem NTFS. NTFS consente di definire flussi "denominati" alternativi in ​​un unico file. Il solito contenuto è nel main = stream senza nome. Ha qualcosa a che fare con le informazioni extra che puoi vedere quando fai clic con il tasto destro su un file e controlla le proprietà.
Purtroppo C# non ha supporto per più flussi, ma ci sono degli scarti open source che possono aiutarti.

Vedi this link per un bel involucro per leggere e scrivere più flussi di un singolo file in C#

1

flussi di dati alternativi potrebbero funzionare. Utilizzando la sintassi :: stream è possibile creare un flusso di dati all'interno dei dati exe e di lettura/scrittura. Modifica: per creare/accedere a un flusso di dati alternativo, verrà utilizzato un nome file diverso. Qualcosa come: applicAtion.exe: impostazioni: $ dati questo accederà a un flusso di dati denominato "impostazioni" all'interno di application.exe. Per fare ciò è necessario aggiungere: settings: $ data al nome del file durante la lettura o la scrittura sul file. Questa funzionalità è fornita da ntfs, quindi lavora in C# e dovrebbe funzionare quando l'applicazione è in esecuzione.

Ulteriori informazioni sono disponibili presso: http://msdn.microsoft.com/en-us/library/aa364404(VS.85).aspx

+0

scusa per essere pedante - ma hai usato la sintassi che somiglia al C++ giusto? – t0mm13b

+0

Ho aggiunto una descrizione migliore dei flussi di dati alternativi. Questa è una funzionalità del filesystem e non è specifica per la lingua. – Mike

0

Se si vuole prendere i dati con voi e per avere un solo file per l'exe e dati, li .ZIP in un exe autoestraente.

0

è possibile aggiungere i dati alla fine del file eseguibile:

var executableName = Process.GetCurrentProcess().MainModule.FileName; 

    // rename executable file 
    var newExecutableName = fullPath.Replace(".exe", "_.exe"); 
    FileInfo fi = new FileInfo(executableName); 
    fi.MoveTo(newExecutableName); 

    // make copy of executable file to original name 
    File.Copy(newExecutableName, executableName); 

    // write data end of new file 
    var bytes = Encoding.ASCII.GetBytes("new data..."); 

    using (FileStream file = File.OpenWrite(executableName)) 
     { 
      file.Seek(0, SeekOrigin.End); 
      file.Write(bytes, 0, bytes.Length); 
     } 

    // we can delete old file when exited