silverlight 如何获取服务器上的文件大小

ZXY900213 2013-06-03 05:20:47
/// <summary>
/// 文件块大小为4M ( 如果文件总大小超过 _chunkSize 定义的大小,则把该文件切割成大小为 _chunkSize 的文件块分批下载 )
/// </summary>
private int _chunkSize = 4 * 1024 * 1024;

/// <summary>
/// 已经下载的字节数
/// </summary>
private long _downloadedBytes = 0;

/// <summary>
/// 要下载的文件的总大小
/// </summary>
private long _length;

/// <summary>
/// 要下载的文件的地址
/// </summary>
public string Url = "http://localhost/Downloader/test.rar";

/// <summary>
/// 获取文件大小
/// </summary>
private void GetFileSize()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.Url);
request.BeginGetResponse(result =>
{
HttpWebRequest req = (HttpWebRequest)result.AsyncState;
HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(result);
this._length = res.ContentLength;
}, request);
}

private void BeginRequest()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.Url);
request.Headers["Range"] = "bytes=" + this._downloadedBytes + "-" + (this._downloadedBytes + _chunkSize - 1);
request.BeginGetResponse(new AsyncCallback(ResponseCallBack), request);
}

private void ResponseCallBack(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
//this._lenght = response.ContentLength;// 这里获取的大小为当前请求的块大小
int count = 0;
using (System.IO.Stream stream = response.GetResponseStream())
{
string savaName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\test.rar";
System.IO.FileMode mode = this._downloadedBytes > 0 ? System.IO.FileMode.Append : System.IO.FileMode.CreateNew;
using (System.IO.FileStream fileStream = System.IO.File.Open(savaName, mode))
{
byte[] bytes = new byte[4096];
int read;
while ((read = stream.Read(bytes, 0, bytes.Length)) != 0)
{
fileStream.Write(bytes, 0, read);
count += read;
}
}
}
this._downloadedBytes += count;

if (_downloadedBytes < this._length)
{
this.BeginRequest();
}
}


我如何能获取服务器文件的总大小??如果我调用自己定义的GetFileSize方法获取的话,他貌似会把整个文件都一次下载下来,这样的话我分批下载就没意义了。。有什么办法获取到文件的总大小??请各大侠指点指点。。
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bonjour-你好 2013-06-04
  • 打赏
  • 举报
回复
在你的GetFileSize方法中,设置 HttpWebRequest 的 Method 属性:

request.Method = "HEAD";
Bonjour-你好 2013-06-04
  • 打赏
  • 举报
回复
引用 2 楼 ZXY900213 的回复:
[quote=引用 1 楼 KumaPower 的回复:] 在你的GetFileSize方法中,设置 HttpWebRequest 的 Method 属性:

request.Method = "HEAD";
HEAD方式不支持。 MSDN里的原话: Method 属性只能设置为 GET 和 POST 方法。 任何其他 HTTP 1.1 或 1.0 协议谓词(例如,HEAD、PUT、DELETE、TRACE 或 OPTIONS)都将引发 NotSupportedException 异常。[/quote] 不好意思,这次回复我没有仔细测试过,确实不能直接改 Method 属性
ZXY900213 2013-06-04
  • 打赏
  • 举报
回复
引用 1 楼 KumaPower 的回复:
在你的GetFileSize方法中,设置 HttpWebRequest 的 Method 属性:

request.Method = "HEAD";
多谢提示。。现在问题解决了。http://q.cnblogs.com/q/50847/
ZXY900213 2013-06-04
  • 打赏
  • 举报
回复
引用 1 楼 KumaPower 的回复:
在你的GetFileSize方法中,设置 HttpWebRequest 的 Method 属性:

request.Method = "HEAD";
HEAD方式不支持。 MSDN里的原话: Method 属性只能设置为 GET 和 POST 方法。 任何其他 HTTP 1.1 或 1.0 协议谓词(例如,HEAD、PUT、DELETE、TRACE 或 OPTIONS)都将引发 NotSupportedException 异常。
P13_Blazor项目模板讲解ThreeBlazor2020_1_11.rar Blazor与Flex和silverlight有点像,Flex和silverlight有一些大厂反对,不支持flex和silverlight Blazor使用Web Assembly标准,Web Assembly是一种业界标准,所有浏览器都支持它,类似于Java字节码,各种语言都可以编译过去 WebAssembly和Blazor:解决了一个存在十年的老问题 WebAssembly 是一种新的客户端技术,可以在所有现代浏览器(包括移动浏览器)中实现近乎原生的性能,而且不需要插件。 许多语言,包括 C、C#、Go 和 Rust,都可以编译成面向基于栈的 WebAssembly 虚拟机的代码。 .NET 代码可以在任何地方运行,包括浏览器内部。 Blazor 是一个客户端库,它在 WebAssembly 上使用.NET 来支持借助 Razor 模板使用 C# 编写的单页应用程序。 Blazor 支持代码重用和将遗留代码移植到现代 Web 应用程序的能力。 在 2019 年 4 月中旬,微软悄悄地推出了一个年轻的框架,从“一切皆有可能”的实验阶段过渡到“我们致力于实现这一目标”的预览版。这个框架名为Blazor,因为它在浏览器中运行,并利用了一个名为 Razor 的模板系统或“视图引擎”,促成了这个.NET 开发人员几乎放弃了的场景。它不仅允许开发人员使用 C# 构建客户端代码(不需要 JavaScript),还允许开发人员在没有插件的情况下在浏览器中运行现有的.NET 标准 DLL。 https://blog.csdn.net/sD7O95O/article/details/91667930 通过Blazor使用C#开发SPA单页面应用程序(1) - 简介及特点 https://www.cnblogs.com/liuxtj/archive/2019/08/13/11344539.html Blazor是一个新的Web UI框架,使用C#,Razor和HTML以及WebAssembly (W3C标准)。它允许您使用C#而不是JavaScript构建交互式Web UI。Blazor应用程序由使用C#,HTML和CSS实现的可重用Web UI组件组成。客户端和服务器代码都是用C#编写的,允许您共享代码和库。 在WebAssembly或服务器上运行 Blazor可以使用WebAssembly直接在浏览器中运行客户端C#代码。因为它是在WebAssembly上运行的真实.NET,所以您可以从应用程序的服务器端部分重用代码和库(客户端渲染)。 或者,Blazor可以在服务器上运行您的客户端逻辑。客户端UI事件使用SignalR(实时消息传递框架)发送回服务器。执行完成后,所需的UI更改将发送到客户端并合并到DOM中(服务器端渲染)。 Web Assembly (Wasm) 基于W3C开放标准,用于在浏览器中运行低级字节代码。使用此标准,我们可以直接在浏览器中运行服务器端语言(Rust,C ++,C#...)而不是Javascript。 还记得Java applet和Microsoft Silverlight吗,我们必须在浏览器中安装插件来运行Java和C#代码,但是WebAssembly提供了基本标准,现在我们不需要任何插件,他的二进制格式以.wasm文件表示,能够提供接近本机的性能。 Blazor ● 基于Component的编程模型,Blazor是用来写组件的 Blazor宿主模型 host model ● 客户端 Client Side ● 服务器端 Server Side 客户端宿主模型 Server Browser Components -----+mono ------> Components c# Assemblies/DLLs Javascript 将dll从服务器端传送到客户端的同时,客户端浏览器不懂这些c#写的dll, 因此还会传送一个特制版本的mono Mono ● 也是一个开源的.NET Framework ● 它可以解释IL,中间语言 ● 代码的IL是包含在.NET的Assembly里面 ● 浏览器之所以可以执行mono,是因为它接收到的mono版本是使用 一种类似汇编(Assembly)的低级语言编写的。而浏览器可以理解 这种语言,它就是WebAssembly. ● 然后

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧