| 

.NET C# Java Javascript Exception

1
Hallo Leute,
ich würde gerne sämtliche Resourcen meiner Anwendung in eine Datei auslagern, d. h.:
Bild01.jpeg, Bild02.jpeg, Sound1.wav, Sound2.wav, Video01.avi
in
z. B. Application.StartupPath & "\data.dat".

Wie kann ich nun sämtliche Daten, da ja nicht alle vom Typ string sind, in einer Datei speichern und zur Laufzeit auslesen? Es ist nämlich meines erachtens ach die Grafiken, Sounds etc. eines Spiels in "Unterordnern" (images/Bild01.jpeg) abzulegen.

Ich könnte natürlich auch alles in der Projektresourcedatei speicher, allerdings würde ich gerne z. B. bei Update nur die "data.dat" ersetzen und nicht alle Assemblys dazu.

Ich hoffe ich hab mich nicht zu leienhaft ausgedrückt und ihr versteht mein Vorhaben.

Grüße
10.11.2010
spicejam 853 2 6
2
Kurzer Hinweis: Ein ordentlicher Update-Algoritmus erstellt Patches, signiert diese und wendet diese dann, nach Prüfung der Signatur auf dem Client, auf das Installationsverzeichnis an. Dadurch werden idealerweise nur die Teile einer Datei ersetzt die sich auch geändert haben. Die Patch-Datei ist zudem recht klein.
Floyd 11.11.2010
1 Antwort
1
Wie immer kurz und knapp:

ResourceManager rm = ResourceManager.CreateFileBasedResourceManager(
"data", System.AppDomain.CurrentDomain.BaseDirectory.ToString(), null);
Console.WriteLine(rm.GetString("MyString"));


Sollte die Datei: "data.resources" im aktuellen Programmverzeichnis öffnen.

msdn:system.resources.resourcemanager.createfilebasedresourcemanager
msdn:system.resources.resourcemanager - Member

Edit:

Alternativ kannst du auch ein Zip verwenden: SharpZipLib

using (var fs = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)
using (var zf = new ZipFile(fs)) {
var ze = zf.GetEntry(fileName);
if (ze == null) {
throw new ArgumentException(fileName, "not found in Zip");
}

using (var s = zf.GetInputStream(ze)) {
// do something with ZipInputStream
}
}
// Quelle: http://stackoverflow.com/questions/328343/using-sharpziplib-to-unzip-specific-files/328353#328353


Die Datei kannst du dann ja auch mit einem Passwort verschlüsseln.
Und eine Zip-Datei muss ja nicht ".zip" heißen. Als Beispiel kann man hier ".docx" und ".xlsx" nennen. Wenn man die Endung einmal in ".zip" ändert kann man diese öffnen und sich ein Rudel Ordner und XML-Dateien anschauen. Sehr schöne Vorlage vom Konzept her.

Edit: Zip-Archiv-Aufbau - basierenden auf dem Kommentar von 'spicejam'

Also ich würd in dem Zip-Archiv die einzelnen Dateien speichern.
Strings würd ich als XML-File abspeichern.
Mit den oben geschrieben Code kannst du eine einzelne Datei aus einem Zip-Archiv lesen. Im obrigen Code ist die Unterschützung für Unterordner noch nicht drin, läßt sich aber mit 1-2 Zeilen einbauen.

So könnte deine Zip-Datei aufgebaut sein:
/<zip-root>/
--/Sounds/
--/BackgroundMusik/
--/Musik1.mp3
--/Musik2.mp3
--/Musik3.mp3
--/Spell/
--/BaseAttack.mp3
--/Fireball_1.mp3
--/Fireball_2.mp3
--/Frostball_1.mp3
--/Textures/
--/Background/
--/Water_1.png
--/Water_2.png
--/Earth_1.png
--/Earth_2.png
--/Creatures/
--/Monster_1.png
--/Monster_2.png
--/Monster_3.png
--/PlayerModel_1.png
--/PlayerModel_2.png
--/Strings/
--/de-DE/
--/UI.xml
--/Dialogs.xml
--/en-EN/
--/UI.xml
--/Dialogs.xml
11.11.2010
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Sag mal, du hast auf alles ein Antwort :-). Respekt! Das sind schonmal sehr gute Vorschläge, das mit dem "Resource-Manager" hab ich schon gelesen gehabt. Allerdings hätte ich gerne eine Datei die nicht jeder einsehen kann. Das mit der ZipLib hört sich schonmal passend für mein Vorhaben an. Meinst du ich soll, die mit dem Resource-Manager erstellte Datei mit der ZipLib in ein eigenes Archiv komprimieren? Wenn nicht, dann wüsste ich nicht wie ich einzelene Dateien in dem ZipArchiv laden/ reinschreiben könnte.
Danke. Grüße.
spicejam 11.11.2010
Danke für die Blumen. Mann muss nur ein paar kreative Ideen haben und google benutzen. Das ganze kommt dann mit der Erfahrung von alleine. Hab meinen Beitrag editiert um dir eine Antwort auf deine Frage zu geben.
Floyd 11.11.2010

Stelle deine .net-Frage jetzt!