在下载IsolatedsStorage之前/之后保留原始文件名?(c# / WindowsPhone)

本文关键字:WindowsPhone 文件名 保留 IsolatedsStorage 下载 之前 之后 原始 | 更新日期: 2023-09-27 18:17:51

我正在通过WebClient类和OpenReadAsync方法下载PDF文件到隔离存储。一旦我将文件保存到IsolatedSotrage,我将其命名为"file.pdf",但我需要保留原始名称。我怎么能做到呢?我做了一些研究,我知道在下载之前获得文件名是困难的,不是很方便,因为一些头信息可能会丢失。但是下载之后呢?我可以下载吗?OpenReadCompleted完成方法?只是不知道该怎么做。

谢谢所有。

在下载IsolatedsStorage之前/之后保留原始文件名?(c# / WindowsPhone)

假设您知道通过URL下载的文件名,或者至少可以解析它。假设您可以通过UserState对象将其传递给事件处理程序:

myClient.OpenReadAsync(url, filenameFromUrl);
然后,在事件处理程序中:
void OnOpenReadCompleted(OpenReadCompletedEventArgs e)
{
   string filename = e.UserState.ToString();
}

如果你不知道URL或无法获得文件名,因为它是某种web服务屏蔽了它,那么不,你不能从事件参数中获得它

您需要使用HttpWebRequest并获取响应头。下面是概念验证代码,但它可以很容易地集成到您已经拥有的任何流程中:

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        HttpWebRequest req = HttpWebRequest.CreateHttp("http://www.geekchamp.com/marketplace/components/windows-phone-toolkit-in-depth-3rd-edition/downloadfree?id=381255");
        req.BeginGetResponse(new AsyncCallback(ReadCallback), req);
    }
    private void ReadCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest req = (HttpWebRequest)asynchronousResult.AsyncState;
        HttpWebResponse response = (HttpWebResponse)req.EndGetResponse(asynchronousResult);
        // RegEx to extract file name from headers
        var reFile = new Regex("filename='"(.*?)'"");
        // The header that contains the filename. Example:
        // Content-Disposition: attachment; filename="Windows Phone Toolkit In Depth 3rd Abstract.pdf"
        var contentDisposition = response.Headers["Content-Disposition"];
        // FIXME: this assumes match success. Might be easier to just use a replace
        var filename = reFile.Match(contentDisposition).Groups[1].Value;
        // ... your code here ...
    }