Frage

Ist es möglich, eine binäre Datei in .NET und tut normale Dateioperationen auf Cache-Datei zwischengespeichert werden?

War es hilfreich?

Lösung

Die Art und Weise, dies zu tun ist, den gesamten Inhalt aus dem FileStream in ein MemoryStream Objekt zu lesen, und dann verwenden Sie dieses Objekt für I / O später. Beiden Typen erben von Stream, so dass die Nutzung wird effektiv identisch.

Hier ist ein Beispiel:

private MemoryStream cachedStream;

public void CacheFile(string fileName)
{
    cachedStream = new MemoryStream(File.ReadAllBytes(fileName));
}

So rufen Sie die CacheFile Methode einmal, wenn Sie die angegebene Datei gecached werden sollen, und anderswo in Code verwendet cachedStream zum Lesen dann. (Die aktuelle Datei wird, sobald sein Inhalt geschlossen wurde zwischengespeichert.) Nur daran zu denken, cachedStream zu entsorgen, wenn Sie mit ihm fertig sind.

Andere Tipps

Jedes modernes O hat ein Caching-System eingebaut, so in der Tat, wenn Sie mit einer Datei in Wechselwirkung treten, sind Sie mit einer In-Memory-Cache der Datei interagiert.

Vor dem benutzerdefinierten Caching Anwendung, benötigen Sie eine wichtige Frage: Was passiert, wenn die zugrunde liegende Datei ändert, so dass meine Cache-Kopie ungültig wird

Sie können die Sache noch komplizierter, wenn die Cache-Kopie ändern dürfen, und die Änderungen müssen zurück auf die zugrunde liegende Datei gespeichert werden.

Wenn die Datei klein ist, es einfacher ist nur MemoryStream zu verwenden, wie in einer anderen Antwort vorgeschlagen.

Wenn Sie Änderungen müssen in die Datei wieder speichern, können Sie eine Wrapper-Klasse schreiben, die alles auf MemoryStream weiterleitet, aber zusätzlich hat eine IsDirty Eigenschaft, dass es auf true gesetzt, wenn ein Schreibvorgang durchgeführt wird. Dann können Sie einige Management-Code haben, der anspringt, wenn Sie wählen (am Ende eines größeren Transaktion?), Sucht nach (IsDirty == true) und speichert die neue Version auf der Festplatte. Dies wird als „lazy write“ Caching genannt, da die Änderungen im Speicher gemacht werden und sind nicht wirklich, bis irgendwann später gespeichert.

Wenn Sie wirklich die Sache noch komplizierter wollen, oder Sie haben eine sehr große Datei, könnten Sie Ihr eigenes Paging implementieren, in dem Sie eine Puffergröße wählen (vielleicht 1 MB?) Und halten Sie eine kleine Anzahl von byte[] Seiten dieser festen Größe . Dieses Mal würde man eine schmutzige Flagge für jede Seite hat. Sie würden die Stream-Methoden implementieren, so dass sie die Details des Anrufers zu verbergen, und ziehen Sie in (oder verwerfen) Seitenpuffer bei Bedarf.

Schließlich, wenn Sie ein leichteres Leben wollen, versuchen Sie:

http://www.microsoft.com/Sqlserver/2005 /en/us/compact.aspx

Damit können Sie die gleichen SQL-Engine wie SQL Server verwenden, aber auf einer Datei, mit allem, was in Ihrem Prozess geschieht, anstatt über einen externen RDBMS-Server. Dadurch werden Ihnen wahrscheinlich gibt eine viel einfachere Art und Weise von Abfragen und die Dateien zu aktualisieren, und die Notwendigkeit für eine Menge von handgeschriebenem Persistenz-Code zu vermeiden.

Nun können Sie natürlich lesen Sie die Datei in ein byte [] Array und beginnen, daran zu arbeiten. Und wenn Sie möchten, einen Stream nutzen Sie Ihre Filestream in einen Memorystream kopieren und starten Sie mit ihm arbeiten - wie:

public static void CopyStream( Stream input, Stream output )
{
        var buffer = new byte[32768];
        int readBytes;
        while( ( readBytes = input.Read( buffer, 0, buffer.Length ) ) > 0 )
        {
                output.Write( buffer, 0, readBytes );
        }
}

Wenn Sie sind besorgt über die Leistung -. Gut, in der Regel der Build-in Mechanismen der verschiedenen Dateizugriffsmethoden sollten genug sein

Ich weiß nicht, was genau Sie tun, aber ich biete diesen Vorschlag (das kann oder nicht durchführbar sein, je nachdem, was Sie tun):

Statt nur den Inhalt des Datei-Caching, warum Sie nicht den Inhalt der Datei in einer schönen stark typisierte Auflistung von Elementen setzen, und dann, dass cachen? Es wird wohl für Artikel ein bisschen leichter machen suchen, und schneller, da es keine Parsing beteiligt ist.

Es ist ein sehr elegantes Caching-System in Lucene dass Caches Bytes von der Platte in den Speicher und auf intelligente Weise aktualisiert der Speicher etc. Sie vielleicht einen Blick auf diesen Code haben wollen eine Vorstellung davon zu bekommen, wie sie es tun. Vielleicht möchten Sie auch auf dem Microsoft SQL Server-Datenspeicherschicht lesen - wie der MSSQL-Team über einige der entscheidenden Details der Implementierung ziemlich ausbleibt

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top