2009-04-07 22 views
7

Sto tentando di memorizzare un database di Access vuoto (.mdb) come risorsa nella mia applicazione. Poi voglio scriverlo sul file system e popolarlo con le definizioni della tabella, ecc. Il problema che sto avendo in Visual Studio 2005 e nella mia applicazione C# è che non posso accedere alla risorsa memorizzata nello stesso assembly (che io avrei pensato sarebbe stato accessibile di default). Ecco il mio codice:Come accedere a una risorsa binaria in un'applicazione 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 restituisce NULL e in base alla documentazione che è perché la risorsa deve essere privata (perché anche se non esiste viene restituito un valore non nullo). Quindi la mia domanda è questa:

Come posso rendere la mia risorsa accessibile alla mia applicazione? L'ho già aggiunto al progetto e, a proposito, l'ho contrassegnato come "Risorsa incorporata".

Grazie!

risposta

16

È necessario inserire il prefisso "empty.mdb" con lo spazio dei nomi predefinito dell'assembly. Qualcosa di simile:

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

è anche possibile controllare i nomi dei vostri risorse invocando

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

Inoltre, assicurarsi che il file è contrassegnato con empty.mdb risorsa incorporata sull'azione compilation

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

1

Questo estrarrà un file di risorse incorporato 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(); 
     } 
    } 

È molto utile per i test di unità C# che richiedono file di dati in cui le DLL in genere vengono eseguite senza file di contenuto presenti (possono essere eseguite in cartelle temporanee create dal framework di test dell'unità).

Questo ha un altro frammento di codice per i file di testo (non file binari) anche se potrebbe avere perdite di memoria in quanto non è riuscito a utilizzare l'istruzione using.

Problemi correlati