In meiner Anwendung kann ich einige Mediendateien aus dem Internet herunterladen. Normalerweise verwende ich WebClient.OpenReadCompleted Methode zum Herunterladen, Entschlüsseln und Speichern der Datei zu IsolatedStorage. Es funktionierte gut und sah wie folgt aus:Datei in Stücke herunterladen (Windows Phone)
private void downloadedSong_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e, SomeOtherValues someOtherValues) // delegate, uses additional values
{
// Some preparations
try
{
if (e.Result != null)
{
using (isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
// working with the gained stream, decryption
// saving the decrypted file to isolatedStorage
isolatedStorageFileStream = new IsolatedStorageFileStream("SomeFileNameHere", FileMode.OpenOrCreate, isolatedStorageFile);
// and use it for MediaElement
mediaElement.SetSource(isolatedStorageFileStream);
mediaElement.Position = new TimeSpan(0);
mediaElement.MediaOpened += new RoutedEventHandler(mediaFile_MediaOpened);
// and some other work
}
}
}
catch(Exception ex)
{
// try/catch stuff
}
}
Aber nach einiger Untersuchung fand ich heraus, dass mit großen Dateien (für mich ist es mehr als 100 MB ist) Ich bin immer OutOfMemory Ausnahme während diese Datei herunterzuladen. Ich nehme an, dass, weil WebClient.OpenReadCompleted den gesamten Strom in RAM und Drosseln lädt ... Und ich werde mehr Gedächtnis benötigen, um diesen Strom zu entschlüsseln.
Nach einer anderen Untersuchung, habe ich gefunden, wie große Datei in Stücke nach OpenReadCompleted Ereignis beim Speichern dieser Datei zu IsolatedStorage (oder Entschlüsselung und dann speichern in meinem Fall), aber dies würde nur mit einem Teil des Problems helfen. .. Das primäre Problem ist , wie Telefondrosseln während Download-Prozess zu verhindern. Gibt es eine Möglichkeit, große Dateien in Chunks herunterzuladen? Dann könnte ich die gefundene Lösung verwenden, um den Entschlüsselungsprozess zu durchlaufen. (Und noch würde ich brauche einen Weg zu finden, so große Datei in Mediaelement zu laden, aber das wäre eine andere Frage sein)
Antwort:
private WebHeaderCollection headers;
private int iterator = 0;
private int delta = 1048576;
private string savedFile = "testFile.mp3";
// some preparations
// Start downloading first piece
using (IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isolatedStorageFile.FileExists(savedFile))
isolatedStorageFile.DeleteFile(savedFile);
}
headers = new WebHeaderCollection();
headers[HttpRequestHeader.Range] = "bytes=" + iterator.ToString() + '-' + (iterator + delta).ToString();
webClientReadCompleted = new WebClient();
webClientReadCompleted.Headers = headers;
webClientReadCompleted.OpenReadCompleted += downloadedSong_OpenReadCompleted;
webClientReadCompleted.OpenReadAsync(new Uri(song.Link));
// song.Link was given earlier
private void downloadedSong_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
try
{
if (e.Cancelled == false)
{
if (e.Result != null)
{
((WebClient)sender).OpenReadCompleted -= downloadedSong_OpenReadCompleted;
using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(savedFile, FileMode.Append, FileAccess.Write, myIsolatedStorage))
{
int mediaFileLength = (int)e.Result.Length;
byte[] byteFile = new byte[mediaFileLength];
e.Result.Read(byteFile, 0, byteFile.Length);
fileStream.Write(byteFile, 0, byteFile.Length);
// If there's something left, download it recursively
if (byteFile.Length > delta)
{
iterator = iterator + delta + 1;
headers = new WebHeaderCollection();
headers[HttpRequestHeader.Range] = "bytes=" + iterator.ToString() + '-' + (iterator + delta).ToString();
webClientReadCompleted.Headers = headers;
webClientReadCompleted.OpenReadCompleted += downloadedSong_OpenReadCompleted;
webClientReadCompleted.OpenReadAsync(new Uri(song.Link));
}
}
}
}
}
}
Sie diese Frage stellen haben? http://stackoverflow.com/questions/14600426/how-to-download-and-save-large-1gb-video-files-from-web-into-windows-phone-8/14602104#14602104 Werfen Sie einen Blick auf meine Antwort –
@Hermit, nein, ich habe das nicht einmal bemerkt, weil ich Windows-Phone-8 nicht in meinen Lieblings-Tags habe. Leider hilft mir deine Antwort nicht, theoretisch weiß ich, was ich tun soll :) Die Frage ist "Wie?" – Olter
vielleicht hilft das http://stackoverflow.com/questions/5659189/how-to-split-a-large-file-into-chunks-in-c –