Anwendung erstellen, die eine Projekt-Datei abspeichert

Tikonteroga

Erfahrenes Mitglied
Hallo,

ich bin zurzeit dabei eine Anwendung zu erstellen mit der eine gewisse Aufgabe erledigt wird.

Dafür ist es in dieser Anwendung möglich ein Projekt zu erstellen, so wie es von Anwendungen wie z. B. Visual Studio und Eclipse gemacht wird.

Ich könnte diese Projekte nun als Verzeichnis speichern und dort die einzelnen Projekt-Dateien (hauptsächlich XML).

Ich möchte aber die Möglichkeit haben, die Projekte zu komprimieren und evtl. zu verschlüsseln.

Bei einem ersten Prototypen bin ich folgendermaßen vorgegangen.

  • Zwischen dem Öffnen bzw. Erstellen eines Projekts und dem Schließen eines Projekts halte ich alle Dateien im Speicher. Die geschieht zum Teil in der Form von Instanzen der Klasse XmlDocument
  • Wenn das Projekt mit "Speichern" bzw. "Speichern unter..." gespeichert wird, werden alle Dateien (z. B. Instancen von XmlDocument) in einem temporären Verzeichnis gemäß dem FileSystem der Projektstruktur (beschrieben in einer XML-Datei) gespeichert. Anschließend wird die das temporäre Verzeichnis komprimiert und in der eigentlichen Projektdatei gespeichert.

Für die Komprimierung des temporären Verzeichnisses verwende die Library IonicZip.

Ich habe jetzt an meinem Konzept folgende Schwächen bzw. Probleme erkannt.

  • Wenn ich das temporäre Verzeichnis erstelle muss ich möglichst einen Namen vergeben, der von keiner anderen Datei verwendet wird. Gibt es hierfür evtl. eine Bibliotheksfunktion ? Ich habe in der Klasse Path eine Methode gefunden, die eine *.tmp mit eindeutigem Namen erstellt. Kann ich hier evtl. ansetzen?
  • Gibt es evtl. die Möglichkeit, dass ich im Speicher (RAM) ein temporäres Verzeichnis z. B. in Form eines Streams erstelle, dass ich dann direkt in das Zip-Archiv schreiben kann ?

Hättet ihr vielleicht eine Idee bzw. einen Vorschlag wie ich mein Vorhaben stabiler, schneller und einfacher umsetzen könnte ?

Über Vorschläge würde ich mich sehr freuen.
 
Hi

zum RAM-Zwischenlager: Es gibt eine Klasse MemoryStream
Zu der Kompression: Warum eine externe Lib verwenden? Komprimieren kannst du auch mit .NET-Bordmitteln.

Gruß
 
Hallo,

also ich habe schon versucht mit .NET Boardmitteln zu komprimieren, habe es aber für meinen Zweck nicht hinbekommen. Wenn ich es aber doch mit .NET Boardmitteln hinbekommen würde, wäre das super.

Könntest du mir vielleicht einen Link zu einem Code-Beispiel zuschicken.

Für mich bestehen im Prinzip folgende Anforderungen für eine Komprimierung.

void Compress(string directoryName, string fileName);

void Uncompress(string fileName, string directoryName);

oder

void Compress(MemoryStream stream, string fileName);

void Uncompress(string fileName, MemoryStream stream);

Dabei ist fileName die komprimierte Datei, directoryName ein temporäres Verzeichnis und MemoryStream wie du gesagt hast, eine Abbildung eines Directories im Ram.
 
Hallo,

danke ich schau mir das gleich mal an.

Ich hätte da noch eine Frage.

Ich habe eine Klasse Projekt erstellt, die sämtliche XML-Dateien die ich verarbeiten muss als XmlDocument-Instancen im Speicher hält.

Wenn ich mein Projekt in der Anwendung speicher, muss ich ja alle XmlDocument-Instancen in meiner Projektdatei abspeichern.

Code:
XmlWriter xmlWriter = XmlWriter.Create(fileName);

XmlDocument xmlDocument.WriteTo(xmlWriter);

Wenn ich von dieser Ausgangssituation ausgehe, komme ich ja um eine Lösung mit einem temporären Verzeichnis nicht herum, weil ich ja immer einen Pfad im Dateisystem angeben muss (siehe: fileName).

Siehst du evtl. noch andere Möglichkeiten ?
 
Hallo,

ich habe mal geschaut und sowohl für das Lesen und das Schreiben von XML-Dateien entsprechende Methoden gefunden.

Code:
MemoryStream memoryStream = new MemoryStream();

XmlDocument xmlDocument = new XmlDocument();

xmlDocument.Load(stream);

Code:
MemoryStream memoryStream = new MemoryStream();

XmlWriter xmlWriter = XmlWriter.Create(stream)

Wenn das mit dem Komprimieren und dem Entkomprimieren auch so klappt, wie du gesagt hast, stehe ich jetzt noch vor folgender offenen Frage.

Wenn ich nun eine Projektdatei (Zip-Datei im Dateisystem, die eine Ordnerstruktur enthält) als einen Stream einlese, wie komme ich dann an die Stream-Instanzen für meine einzelnen Dateien bzw. wie kann ich innerhalb meiner Projektdatei die Ordnerstruktur definieren ?
 
Dateianzahl, dann pro Datei Dateinamen mit Offset und Byteanzahl abspeichern.
Als "Verzeichnis". Dann erst die Daten.

Beim Laden dann zuerst im Dateiverzeichnis schauen, obs die Datei gibt, an welcher Position sie beginnt und wieviel Byte es sind. Den benötigten Byteblock herausholen und ihm einen Memorystream geben.

Gruß
 

Neue Beiträge

Zurück