2009-04-07 24 views
7

Estoy tratando de almacenar una base de datos de Access vacía (.mdb) como recurso en mi aplicación. Luego quiero escribir el sistema de archivos y llenarlo con definiciones de tabla, etc. El problema que tengo en Visual Studio 2005 y mi aplicación C# es no poder acceder al recurso almacenado en el mismo ensamblado (que habría pensado sería accesible por defecto). Aquí está mi código:Cómo acceder a un recurso binario en una aplicación C#

byte[] abytResource; 
System.Reflection.Assembly objAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
objStream = objAssembly.GetManifestResourceStream("empty.mdb"); 
abytResource = new Byte[objStream.Length]; 
objStream.Read(abytResource, 0, (int)objStream.Length); 
objFileStream = new FileStream(newDatabasePathWithName, FileMode.Create); 
objFileStream.Write(abytResource, 0, (int)objStream.Length); 
objFileStream.Close(); 

GetManifestResourceStream devuelve NULL y de acuerdo con la documentación que se debe a que el recurso debe ser privada (porque incluso si no existe se devuelve un valor no nulo). Entonces mi pregunta es la siguiente:

¿Cómo hago que mi recurso sea accesible para mi propia aplicación? Ya lo agregué al proyecto y lo marqué como "Recurso incrustado", por cierto.

Gracias!

Respuesta

16

Debe marcar el prefijo "empty.mdb" con el espacio de nombres predeterminado del ensamblaje. Algo así como:

objStream = objAssembly.GetManifestResourceStream("My.Namespace.empty.mdb"); 
9

También puede comprobar los nombres de sus recursos mediante la invocación de

string[] myResources = objAssembly.GetManifestResourceNames(); 
foreach(string reso in myResources) { 
    Console.WriteLine(reso); 
} 

También, asegúrese de que el archivo está marcado con empty.mdb recurso incrustado en la acción compilación

alt text http://img520.imageshack.us/img520/6649/sinttuloo.png

1

Esto extraerá un archivo de recursos incrustado binario ...

/// <summary> 
    /// Extracts an embedded file to local file system. 
    /// </summary> 
    /// <param name="resName">Resource name of embedded file. NameSpace.FileName.Extension</param> 
    /// <param name="fileName">Extracted file name</param> 
    public void ExtractEmbeddedFile(string resName, string fileName) 
    { 
     if (File.Exists(fileName)) File.Delete(fileName); 

     Assembly assembly = Assembly.GetExecutingAssembly(); 

     using (var input = assembly.GetManifestResourceStream(resName)) 
     using (var output = File.Open(fileName, FileMode.CreateNew)) 
     { 
      if (input == null) throw new FileNotFoundException(resName + ": Embedded resoure file not found"); 

      var buffer = new byte[32768]; 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, read); 
      } 
      output.Flush(); 
     } 
    } 

Es muy útil para las pruebas de Unidad C# que requieren archivos de datos donde normalmente se ejecutan sus archivos DLL sin contenido (pueden ejecutarse en carpetas temporales creadas por el marco de prueba de la unidad).

Esto tiene otro fragmento de código para archivos de texto (no archivos binarios) aunque puede tener pérdidas de memoria ya que no pudo usar la instrucción using.

Cuestiones relacionadas