Как загрузить файл из SkyDrive в IsolatedStorage?
Я пишу приложение WP8 (XAML & C#) для чтения текстового файла из SkyDrive и сохранения его в IsolatedStorage.
Кажется, что файл читается, но данные, которые я получаю, - это описание файла, а не его содержимое.
Имя файла в SkyDrive: "myFile1.txt"
Содержание файла: "это тестовый файл 1"
мой код ниже:
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;
}
}
Данные, которые я получаю, запустив этот код:
{
"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"
}
Я не уверен, почему я не получаю данные внутри файла. Есть идеи, что я делаю не так?
Спасибо,
3 ответа
Я думаю, что вам нужно:
liveClient.BackgroundDownloadAsync( fileID+"/content", new Uri( "/shared/transfers/" + filename, UriKind.Relative ) );
т.е. после fileID
строка, которую нужно было добавить "/content"
для того, чтобы получить содержимое файла, а не метаданные.
Вам дали ссылку в метаданных:
"source": "https://fculgq.bay.livefilestore.com/y2m0zkxi9kpb4orfYNSLSwst5Wy3Z7g6wDj7CM3B6wcOth9eA-gUflXeSCAAH_JWx2co72sgOTcGgvkwQGI3Gn5E1qXnRoKpVbsX_olRrB5gnCNIm8GrUrORco8_-je1cet/myFile1.txt?psid=1"
Используйте его для загрузки файла, например, HttpWebRequest
,
Вот ссылка из MSDN, которая объясняет, что означает параметр Source - например, для аудиофайла.
Два изменения в моем коде:
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;
}
}
Приведенный выше код читает файл правильно. Мне нужно было добавить "/ контент" к fileID. Кроме того, await не будет работать в эмуляторе, но отлично работает в устройстве?! (это было ново для меня.....).