Frage

Ich bin eine Download-Anwendung zu schaffen, und ich wünsche Raum auf der Festplatte für die Dateien vorab zuzuordnen, bevor sie tatsächlich heruntergeladen werden, da sie möglicherweise ziemlich groß sein könnten, und niemand mag „Dieses Laufwerk ist voll, bitte löschen Sie einige Dateien, um zu sehen und Versuch es noch einmal." Also, in diesem Licht, schrieb ich das.

// Quick, and very dirty
System.IO.File.WriteAllBytes(filename, new byte[f.Length]);

Es funktioniert, atleast, bis Sie eine Datei herunterladen, die mehrere hundert MBs ist, oder möglicherweise sogar GB ist und Sie Windows in eine Tracht Prügel Rausch auslösen, wenn nicht völlig die Auslagerungsdatei auszulöschen und Ihre Systeme Speicher insgesamt töten. Oops.

Also, mit einem wenig mehr Aufklärung, habe ich mit dem folgenden Algorithmus aus.

using (FileStream outFile = System.IO.File.Create(filename))
{
    // 4194304 = 4MB; loops from 1 block in so that we leave the loop one 
    // block short
    byte[] buff = new byte[4194304];
    for (int i = buff.Length; i < f.Length; i += buff.Length)
    {
        outFile.Write(buff, 0, buff.Length);
    }
    outFile.Write(buff, 0, f.Length % buff.Length);
}

Das funktioniert gut, auch, und nicht das lähmende Speicherproblem der letzten Lösung leiden. Es ist immer noch, obwohl langsam, vor allem auf ältere Hardware, da es (möglicherweise GB im Wert von) Daten aus auf die Festplatte schreibt.

Die Frage ist: Gibt es eine bessere Art und Weise, die gleiche Sache zu vollbringen? Gibt es eine Möglichkeit, um Windows zu sagen, eine Datei von x Größe zu erstellen und einfach den Platz auf dem Dateisystem anzulegen, anstatt tatsächlich eine Tonne Daten zu schreiben. Ich kümmere mich nicht um die Daten in der Datei überhaupt Initialisierung (das Protokoll Ich verwende - Bittorrent - bietet Hashes für die Dateien, die es daher schlimmster Fall für zufällige uninitialised Daten sendet, ist ich einen glücklichen Zufall, und einen Teil der Datei erhalten korrekt ist).

War es hilfreich?

Lösung

FileStream.SetLength ist diejenige, die Sie wollen . Die Syntax:

public override void SetLength(
    long value
)

Andere Tipps

Wenn Sie die Datei erstellen haben, denke ich, dass Sie wahrscheinlich so etwas wie dies tun können:

using (FileStream outFile = System.IO.File.Create(filename))
{
    outFile.Seek(<length_to_write>-1, SeekOrigin.Begin);
    OutFile.WriteByte(0);
}

Wo length_to_write würde die Größe in Bytes der Datei zu schreiben. Ich bin nicht sicher, dass ich die C # Syntax korrekt ist (nicht auf einem Computer zu testen), aber ich habe ähnliche Dinge in C ++ in der Vergangenheit getan, und es hat funktioniert.

Leider kann man nicht wirklich das tut nur durch bis zum Ende zu suchen. Das wird die Dateilänge auf etwas Großes gesetzt, kann aber nicht wirklich Plattenblocks für die Speicherung zuordnen. Also, wenn Sie gehen, um die Datei zu schreiben, wird es immer noch nicht.

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