2010-09-07 15 views
8

Tengo un ejecutable portátil que guarda datos en un archivo en la misma carpeta que el ejecutable. ¿Hay alguna manera de que pueda guardar datos en el ejecutable cuando cierro la aplicación?Guardar datos en ejecutable

Esto quizás sea extraño, pero llevar los datos conmigo y solo tener un archivo para el exe y los datos serían geniales.

Preferiría si esto se hizo con C#, pero no es un requisito.

Respuesta

3

No puede modificar su propio EXE para que contenga datos almacenados en cualquier forma que se acerque a una forma elegante o compacta. En primer lugar, el sistema operativo obtiene un bloqueo en el archivo EXE mientras se ejecuta la aplicación contenida en él. En segundo lugar, un EXE viene precompilado (al menos en MSIL), y la modificación de los datos fuente del archivo generalmente requiere una recompilación para restablecer varios punteros a los identificadores de código, o bien un conocimiento GRAVE en un nivel muy esotérico sobre lo que estás haciendo el archivo.

Los métodos generalmente aceptados son el archivo de configuración de la aplicación, un archivo de recursos o algún archivo personalizado que cree/lea/modifique en el tiempo de ejecución, como lo está haciendo ahora. Dos archivos para una aplicación no deben ser motivo de preocupación

+0

Sí, sé que no está mal como está, pero con Mac puedes copiar el ejecutable, que también es una carpeta, y toda tu información va contigo. Parece un pequeño detalle, pero me gustaría ponerlo a trabajar. –

1

¿Ahora mismo estás usando un archivo app.config (y Settings.settings)? Creo que esta es la forma más compacta de guardar datos cerca del .exe.

Dudo mucho que pueda alterar el manifiesto del .exe, o cualquier otra parte del mismo.

Editar: Al parecer, podría haber algunas maneras después de todos: http://www.codeproject.com/KB/msil/reflexil.aspx

2

Usted puede, mediante la reserva de espacio a través de los medios de utilizar un recurso de cadena y la almohadilla hacia fuera. Debe hacer un poco de trabajo de detective para averiguar exactamente en qué punto del desplazamiento se encuentra el ejecutable en el que desea volcar los datos, pero tenga cuidado, el archivo será "en uso", por lo tanto proceda con cuidado con eso.

+0

Consulte este otro anuncio que hice hace eones ... http://stackoverflow.com/questions/1780260/write-a-value-into -pe-file/1780360 # 1780360 – t0mm13b

1

Hay una forma de usar varias transmisiones, pero solo funciona en sistemas de archivos NTFS. NTFS le permite definir flujos alternativos "con nombre" en un archivo. El contenido habitual se encuentra en la transmisión principal = sin nombre. Tiene algo que ver con la información adicional que puede ver cuando hace clic derecho en un archivo y verifica las propiedades.
Desafortunadamente, C# no tiene soporte para múltiples transmisiones, pero existen proyectos de código abierto que pueden ayudarlo.

Ver this link para un buen envoltorio para leer y escribir múltiples flujos a un solo archivo en C#

1

alterno flujo de datos podría funcionar. Al usar la sintaxis :: stream, puede crear una secuencia de datos dentro de su exe y leer/escribir datos. Editar: para crear/acceder a una secuencia de datos alternativa, usará un nombre de archivo diferente. Algo así como: applicAtion.exe: configuración: $ data esto accederá a una secuencia de datos llamada "configuración" dentro de application.exe. Para hacer esto, necesita agregar: settings: $ data al nombre de archivo al leer o escribir en el archivo. Esta funcionalidad la proporcionan los ntfs, por lo que se muestra el trabajo en C# y debería funcionar cuando la aplicación se está ejecutando.

información adicional está disponible en: http://msdn.microsoft.com/en-us/library/aa364404(VS.85).aspx

+0

siento ser pedante, pero usaste una sintaxis que se parece a C++ ¿verdad? – t0mm13b

+0

Agregué una mejor descripción de flujos de datos alternativos. Esta es una característica del sistema de archivos y no es específica del idioma. – Mike

0

Si usted quiere tomar los datos con usted y sólo tienen un archivo para el exe y datos, ellos .zip en un .exe autoextraíble.

0

puede agregar datos al final del archivo ejecutable:

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 
Cuestiones relacionadas