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(); } } }
Jest tutaj wiele ciekawych i istotnych informacji.
OdpowiedzUsuń