简体   繁体   English

如何从SkyDrive下载文件到IsolatedStorage?

[英]How to download a file from SkyDrive into IsolatedStorage?

I am writing a WP8 (XAML & C#) application to read a text file from SkyDrive and save it into the IsolatedStorage. 我正在编写一个WP8(XAML和C#)应用程序来从SkyDrive读取文本文件并将其保存到IsolatedStorage中。

It seems that the file is read, but the data I get is the description of the file rather than the content of the file. 似乎读取了文件,但我得到的数据是文件的描述而不是文件的内容。

The file name in SkyDrive is: "myFile1.txt" SkyDrive中的文件名是:“myFile1.txt”
The content of the file is: "this is a test file 1" 该文件的内容是:“这是一个测试文件1”

my code is below: 我的代码如下:

private async void btnDownload_Click( object sender, System.Windows.RoutedEventArgs e )
    {
    string fileID = "file.17ff6330f5f26b89.17FF6330F5F26B89!1644";
    string filename = "myDownloadFile1.txt";
    var liveClient = new LiveConnectClient( LiveHelper.Session );

    // Download the file
    liveClient.BackgroundDownloadAsync( fileID, new Uri( "/shared/transfers/" + filename, UriKind.Relative ) );  

    // Read the file
    var FileData = await LoadDataFile< string >( filename );
    Debug.WriteLine( "FileData: " + (string)FileData );
    }


public async Task<string> LoadDataFile<T>( string fileName )
    {
    // Get a reference to the Local Folder
    string root = ApplicationData.Current.LocalFolder.Path;
    var storageFolder = await StorageFolder.GetFolderFromPathAsync( root + @"\shared\transfers" ); 

    bool IsFileExist = await StorageHelper.FileExistsAsync( fileName, storageFolder );
    if ( IsFileExist == true )
        {
        StorageFile storageFile = await storageFolder.GetFileAsync( fileName );
        if ( storageFile != null )
            {
            // Open it and read the contents
            Stream readStream = await storageFile.OpenStreamForReadAsync();
            using ( StreamReader reader = new StreamReader( readStream ) )
                {
                string _String = await reader.ReadToEndAsync();
                reader.Close();
                return _String;
                }
            }
        else
            {
            return string.Empty;
            }
        } 
    return string.Empty;
    }
}

The data I am getting running this code is: 我运行此代码的数据是:

{
   "id": "file.17ff6330f5f26b89.17FF6330F5F26B89!1644", 
   "from": {
      "name": "Eitan Barazani", 
      "id": "17ff6330f5f26b89"
   }, 
   "name": "myFile1.txt", 
   "description": "", 
   "parent_id": "folder.17ff6330f5f26b89.17FF6330F5F26B89!1643", 
   "size": 23, 
   "upload_location": "https://apis.live.net/v5.0/file.17ff6330f5f26b89.17FF6330F5F26B89!1644/content/", 
   "comments_count": 0, 
   "comments_enabled": false, 
   "is_embeddable": true, 
   "source": "https://fculgq.bay.livefilestore.com/y2m0zkxi9kpb4orfYNSLSwst5Wy3Z7g6wDj7CM3B6wcOth9eA-gUflXeSCAAH_JWx2co72sgOTcGgvkwQGI3Gn5E1qXnRoKpVbsX_olRrB5gnCNIm8GrUrORco8_-je1cet/myFile1.txt?psid=1", 
   "link": "https://skydrive.live.com/redir.aspx?cid=17ff6330f5f26b89&page=view&resid=17FF6330F5F26B89!1644&parid=17FF6330F5F26B89!1643", 
   "type": "file", 
   "shared_with": {
      "access": "Just me"
   }, 
   "created_time": "2013-07-15T16:29:10+0000", 
   "updated_time": "2013-07-15T16:29:10+0000"
}

I am not sure why I am not getting the data inside the file. 我不知道为什么我没有获取文件中的数据。 Any idea what am I doing wrong? 知道我做错了什么吗?

Thanks, 谢谢,

I think you need: 我想你需要:

liveClient.BackgroundDownloadAsync( fileID+"/content", new Uri( "/shared/transfers/" + filename, UriKind.Relative ) );

ie after the fileID string, you needed to add "/content" in order to get the file content, rather than the metadata. 即在fileID字符串之后,您需要添加"/content"以获取文件内容,而不是元数据。

you're given a link in the metadata: 您在元数据中获得了一个链接:

"source": "https://fculgq.bay.livefilestore.com/y2m0zkxi9kpb4orfYNSLSwst5Wy3Z7g6wDj7CM3B6wcOth9eA-gUflXeSCAAH_JWx2co72sgOTcGgvkwQGI3Gn5E1qXnRoKpVbsX_olRrB5gnCNIm8GrUrORco8_-je1cet/myFile1.txt?psid=1"

Use it to download the file, with for example HttpWebRequest . 使用它来下载文件,例如HttpWebRequest

Here's a link from MSDN that explains what the Source parameter means - for example, for an audio file 这是来自MSDN链接,它解释了Source参数的含义 - 例如,音频文件

Two changes in my code: 我的代码有两处变化:

    private async void btnDownload_Click( object sender, System.Windows.RoutedEventArgs e )
        {
        string fileID = "file.17ff6230f5f26b89.17FF6230F5F26B89!1658";
        string filename = "myDownloadFile1.txt";
        var liveClient = new LiveConnectClient( LiveHelper.Session );

        // Download the file
        await liveClient.BackgroundDownloadAsync( fileID + "/Content", new Uri( "/shared/transfers/" + filename, UriKind.Relative ) );

        // Read the file
        var FileData = await LoadDataFile<string>( filename );
        Debug.WriteLine( "FileData: " + (string)FileData );
        }


    public async Task<string> LoadDataFile<T>( string fileName )
        {
        // Get a reference to the Local Folder
        string root = ApplicationData.Current.LocalFolder.Path;
        var storageFolder = await StorageFolder.GetFolderFromPathAsync( root + @"\shared\transfers" );

        bool isFileExist = await StorageHelper.FileExistsAsync( fileName, storageFolder );
        if ( isFileExist )
            {
            // Create the file in the local folder, or if it already exists, just replace
            StorageFile storageFile = await storageFolder.GetFileAsync( fileName );

            if ( storageFile != null )
                {
                // Open it and read the contents
                Stream readStream = await storageFile.OpenStreamForReadAsync();
                using ( StreamReader reader = new StreamReader( readStream ) )
                    {
                    string _String = await reader.ReadToEndAsync();
                    reader.Close();
                    return _String;
                    }
                }
            return string.Empty;
            }
        return string.Empty;
        }
    }

The above code reads the file properly. 上面的代码正确读取文件。 I needed to add "/content" to the fileID. 我需要在fileID中添加“/ content”。 Also, await will not work in the emulator but works fine in the device ?! 此外,await将无法在模拟器中工作,但在设备中工作正常? (this was new to me.....). (这对我来说很新......)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM