C# 下载文件并打开它们
我有一个显示视频文件的用户控件 代码是:C# 下载文件并打开它们,c#,file,windows-8,download,windows-8.1,C#,File,Windows 8,Download,Windows 8.1,我有一个显示视频文件的用户控件 代码是: //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 Acc
//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
消息=访问被拒绝。(HRESULT异常:0x80070005(E_访问被拒绝))
Source=mscorlib
堆栈跟踪:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在c:\Users\afomenko\Desktop***\Controls\VideoControl.xaml.cs中的SalesPlays.Controls.VideoControl.d_u3.MoveNext()中:第43行
内部异常:
p.S.当我在一段迷恋视频下载后运行应用程序时(当然,因为下载是有效的),然后打开视频。为什么第一次使用unthorized失败?
可能我的下载程序中没有关闭某些流?解决方案在我的保存代码中 以下是一个工作示例:
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();
}