当前位置: 首页 > 编程语言 > C#

分块下载文件(WindowsPhone)分享

时间:2023-04-11 03:05:26 C#

分块下载文件(WindowsPhone)在我的应用程序中,我可以从网络上下载一些媒体文件。通常我使用WebClient.OpenReadCompleted方法下载、解密并将文件保存到IsolatedStorage。它运行良好,看起来像这样:privatevoiddownloadedSong_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse,SomeOtherValuessomeOtherValues)//delegate,usesadditionalvalues{//一些准备工作try{if(e.Result!=null){using(isolatedStorageFile=IsolatedStorageFile.GetUserStoreForApplication()){//使用获得的流,解密//将解密的文件保存到isolatedStorageisolatedStorageFileStream=newIsolatedStorageFileStream("SomeFileNameHere",FileMode.OpenOrCreate,isolatedStorageFile);//并使用它为MediaElement设置。(孤立的存储文件流);mediaElement.Position=newTimeSpan(0);mediaElement.MediaOpened+=newRoutedEventHandler(mediaFile_MediaOpened);//和其他一些工作}}}catch(Exceptionex){//try/catchstuff}}但经过一番调查后,我发现对于大文件(对我来说超过100MB),我在下载此文件时遇到OutOfMemoryexception。我猜这是因为WebClient.OpenReadCompleted将整个流加载到RAM并阻塞了......我需要更多内存来解密这个流。经过另一次调查,我发现如何将OpenReadCompleted事件保存到IsolatedStorage后将大文件拆分成块(或者在我的场合解密然后保存),但这只是导致部分问题......问题是如何防止Telephone呛。有没有办法分块下载大文件?然后我可以使用我找到的解决方案来完成解密过程。(而且我仍然需要找到一种方法将这么大的文件加载到mediaElement中,但这将是另一个问题)答:私有WebHeaderCollection标头;私有整数迭代器=0;私人int增量=1048576;私有字符串savedFile="testFile.mp3";//一些准备工作//开始使用(IsolatedStorageFileisolatedStorageFile=IsolatedStorageFile.GetUserStoreForApplication())下载第一块}headers=(new)WebHeaderCollection;headers[HttpRequestHeader.Range]="bytes="+iterator.ToString()+'-'+(iterator+delta).ToString();webClientReadCompleted=newWebClient();webClientReadCompleted.Headers=headers;webClientReadCompleted.OpenReadCompleted+=downloadedSong_OpenReadCompleted;webClientReadCompleted.OpenReadAsync(newUri(song.Link));//song.Link较早给出privatevoiddownloadedSong_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse){if(e.Result!=null){((WebClient)sender).OpenReadCompleted-=downloadedSong_OpenReadCompleted;使用(IsolatedStorageFilemyIsolatedStorage=IsolatedStorageFile.GetUserStoreForApplication()){使用(IsolatedStorageFileStreamfileStream=newIsolatedStorageFileStream(savedFile,FileMode.Append,FileAccess.Write,myIsolatedStorage)){intmediaFileLength=(int)e.Result.Length;byte[]byteFile=newbyte[mediaFileLength];e.Result.Read(byteFile,0,byteFile.Length);fileStream.Write(byteFile,0,byteFile.Length);//如果还有剩余,递归下载if(byteFile.Length>delta){iterator=iterator+delta+1;headers=newWebHeaderCollection();headers[HttpRequestHeader.Range]="bytes="+iterator.ToString()+'-'+(iterator+delta).ToString();webClientReadCompleted.Headers=headers;webClientReadCompleted.OpenReadCompleted+=downloadedSong_OpenReadCompleted;webClientReadCompleted.OpenReadAsync(newUri(song.Link));}}}}}}要分块下载文件,您需要发出多个请求,每个请求一个。不幸的是,不可能说“给我这个文件并以X大小的块返回它”;假设服务器支持它,您可以使用HTTPRange标头来指定服务器应返回文件的哪些字节以响应请求。然后你发出多个请求将文件拆分成多个部分并将它们全部放回设备上。您可能会发现最简单的方法是进行顺序调用并在获得并验证前一个块后开始下一个调用。这种方法使得在用户返回到应用程序时恢复下载变得简单。您只需查看之前下载了多少并获得下一个块。我编写了一个以64K块下载电影(最多2.6GB)的应用程序,然后使用MediaPlayerLauncher从IsolatedStorage播放它们。通过MediaElement播放也应该有效,但我尚未验证。您可以通过将大文件直接加载到IsolatedStorage(通过IsolatedStorageExplorer或类似工具)来对此进行测试,并检查以这种方式播放的内存影响。已确认:您可以使用BackgroundTransferRequest下载多GB的文件,但是您必须将TransferPreferences设置为None以在连接到外部电源并连接到Wi-Fi时强制下载,否则BackgroundTransferRequest将失败。我想知道是否可以使用BackgroundTransferRequest轻松下载大文件并让手机担心实现细节?文档似乎表明可以下载超过100MB的文件,并且“Range”动词保留供自己使用,因此它可能会自动使用它,如果它可以在引擎盖下的话。来自filesover100MB的文档:对于大于100MB的文件,传输的TransferPreferences属性必须设置为None,否则传输将失败。如果您不知道传输的大小并且可能超过此限制,则应将值设置为“无”,这意味着传输只会在手机连接到外部电源并具有Wi-Fi时发生网络连接。有关使用“作用域”动词的文档:BackgroundTransferRequest对象的Headers属性用于设置传输请求的HTTP标头。以下标头保留供系统使用,调用应用程序不能使用。在使用Add(BackgroundTransferRequest)方法排队传输请求时,将以下标头之一添加到Headers集合将导致抛出NotSupportedException:这是文档:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202955(v=vs.105).aspx以上是C#学习教程:分块下载文件(WindowsPhone),分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

猜你喜欢