2013-12-16 135 views
0

我有一个应该显示视频文件的用户控件。下载文件并打开它们

的代码是:

//The code does: Checks if file exists, if yes - opens, if not - goes to download manager and downloads it. 
//After await dMan.downloadVideo(link); finishes - function recursivly calls itself, but code runs into Unauthorized Access Exception 
private async void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     await LoadVideo(); 
    } 

    private async Task LoadVideo() 
    { 
     string link = "http://samples.mplayerhq.hu/MPEG-4/MargotGagnon.mov"; 
     DownloadManager dMan = new DownloadManager(); 
     bool FileNeedsDownload = false; 
     try 
     { 
      Windows.Storage.StorageFile sampleFile = await ApplicationData.Current.LocalFolder.GetFileAsync("Margot.mp4"); 
      var stream = await sampleFile.OpenAsync(Windows.Storage.FileAccessMode.Read); 
      VideoPlayer.SetSource(stream, sampleFile.FileType); 
     } 
     catch 
     { 
      FileNeedsDownload = true; 
     } 
     if (FileNeedsDownload == true) 
     { 
      await dMan.downloadVideo(link); 
      LoadVideo(); 
     } 
    } 

我的下载代码:

public async Task downloadVideo(string link) 
    { 
     string path = ApplicationData.Current.LocalFolder.Path.ToString(); 
      string urlLink = link; 
      await getVideoByUrl(urlLink, "Margot.mp4"); 
    } 
    async public Task getVideoByUrl(string url, string filename) 
    { 
     HttpClientHandler aHandler = new HttpClientHandler(); 
     aHandler.ClientCertificateOptions = ClientCertificateOption.Automatic; 
     HttpClient aClient = new HttpClient(aHandler); 
     aClient.DefaultRequestHeaders.ExpectContinue = false; 
     HttpResponseMessage response = await aClient.GetAsync(url); 
     byte[] img = await response.Content.ReadAsByteArrayAsync();// ReadAsByteArray(); 
     InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); 

     // To save downloaded image to local storage 
     var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
     filename, CreationCollisionOption.ReplaceExisting); 
     var fs = await imageFile.OpenAsync(FileAccessMode.ReadWrite); 
     DataWriter writer = new DataWriter(fs.GetOutputStreamAt(0)); 

     writer.WriteBytes(await response.Content.ReadAsByteArrayAsync()); 
     await writer.StoreAsync(); 
     //current.image.SetSource(randomAccessStream); 
     writer.DetachStream(); 
     await fs.FlushAsync(); 

     // To save downloaded image to bitmap 
     //DataWriter writer2 = new DataWriter(randomAccessStream.GetOutputStreamAt(0)); 
     //writer2.WriteBytes(img); 
     //await writer2.StoreAsync(); 
     //current.image = new BitmapImage(); 
     //current.image.SetSource(randomAccessStream); 
    } 

例外:

System.UnauthorizedAccessException的被抓 的HResult = -2147024891 消息=访问被拒绝。在系统 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务的任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务的任务) :(从HRESULT异常:0X80070005(E_ACCESSDENIED)) 源= mscorlib程序 堆栈跟踪.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at SalesPlays.Controls.VideoControl.d__3.MoveNext()in c:\ Users \ afomenko \ Desktop *** \ Controls \ VideoControl.xaml.cs:line 43 InnerException :

PS当我在暗恋之后运行应用程序 - 下载视频(offcourse,因为下载工作)并打开视频。为什么它在第一次没有被解除的情况下失败?

也许有些流在我的下载器中没有关闭?

回答

0

解决方案在我的保存代码!

这里是工作示例:

var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, Windows.Storage.CreationCollisionOption.ReplaceExisting); 
using (var fs = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)) 
{ 
    var outStream = fs.GetOutputStreamAt(0); 
    var dataWriter = new Windows.Storage.Streams.DataWriter(outStream); 
    dataWriter.WriteString("Hello from Test!"); 
    await dataWriter.StoreAsync(); 
    dataWriter.DetachStream(); 
    await outStream.FlushAsync(); 
    outStream.Dispose(); // 
    fs.Dispose(); 
} 
相关问题