wtorek, 14 lipca 2009

Prosta obsługa Resource’ów aplikacji .NET (C#) [PL]

Obsługa zasobów aplikacji na platformie .NET jest bardzo prosta, zwykle wykorzystywany jest element typu "Resource", który można dodać do projektu, a następnie można przechowywać "w nim" różne inne elementy, jak: napisy, obrazki, ikony lub inne pliki. Wspomniany element typu Resource do obsługi zasobów, które są przez niego obsługiwane wykorzystuje klasę System.Resources.ResourceManager, dodatkowo tworzy on plik z kodem (np. w c#), który w sposób automatyczny udostępnia wybrane zasoby.

Czasami wygodniej jest wykorzystać inny sposób, w jaki można dodać zasób, by później go wykorzystać. Mowa tutaj o wybraniu szczególnej akcji dla pliku wchodzącego w skład projektu, a mianowicie ustawieniu właściwości "Build Action" na "Embedded Resource":

Jak jednak wykorzystać tak dodany do zasobów plik? Należy odwołać się do aktualnego assembly (Assembly.GetExecutingAssembly();), by następnie uzyskać dostęp do strumienia przy pomocy którego można odczytać dany plik z zasobów (myAssembly.GetManifestResourceStream( resname );).

Zobaczmy na poniższy przykład w którym wszystkie pliki, które w projekcie należały do katalogu "ExamplesFolder" i zostały ustawione jako "Embedded Resource" zostają skopiowane do katalogu "Moje dokumenty" bieżącego użytkownika do utworzonego katalogu "ExamplesFolder". Wykorzystana w przykładzie pomocnicza funkcja "CopyStream" ma za zadanie skopiować (binarnie) strumień wejściowy do wyjściowego).

namespace EmbeddedExampleApplication
{
class Program
{
/// <summary>
/// Copies the data between streams.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <param name="outputStream">The output stream.</param>
public static void CopyStream(Stream inputStream, Stream outputStream)
{
byte[] buffer = new byte[512 * 1024]; // buffer creation - size 512 KB
int inputBytesCount;
while ((inputBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, inputBytesCount);
}
}

const string exampleFolder = "ExamplesFolder";

static void Main(string[] args)
{
//creating the directory
string filenamedirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), exampleFolder);
DirectoryInfo InstalationDirectoryInfo = new DirectoryInfo(filenamedirectory);
if (!(InstalationDirectoryInfo).Exists) InstalationDirectoryInfo.Create();
//copying of example files from assembly embedded resources
Assembly myAssembly = Assembly.GetExecutingAssembly();
//we will remove the namespace from file name
//the exampleFolder="ExamplesFolder" is the name of the folder in the solution
string currentNamespace = typeof(Program).Namespace + "." + exampleFolder + ".";
foreach (string resname in myAssembly.GetManifestResourceNames())
if (resname.Contains(exampleFolder))
{
Stream inputstream = myAssembly.GetManifestResourceStream(resname);
string filename = Path.Combine(filenamedirectory, resname.Replace(currentNamespace, ""));
Console.WriteLine(filename);
FileInfo filenameInfo = new FileInfo( filename );
if ( filenameInfo.Exists )
   filenameInfo.Delete();
using (Stream file = File.OpenWrite(filename))
{
   CopyStream(inputstream, file);
}
}
Console.ReadLine();
}
}
}

1 komentarz:

Posty powiązane / Related posts