It has been a long time since I last blogged. I tried out the Azure WordPress blog but was a little disappointed. The layout was not as wide as in this blog which is a problem if you want to cut and paste some code. Also I did not like the idea of storing a password, I would have preferred delegated security using an identity provider like facebook or LiveId. So I will continue here...
I have been using SkyDrive quite extensively. Although it's on very robust hardware there is always a danger that you can accidently delete something. I did not want to install SkyDrive on my virtual PC but I wanted to download the contents of my SkyDrive. So I made a little program to copy all the files to a file store. I used code from http://skydriveapiclient.codeplex.com/releases/view/103081, here's the class that does the work. Using the above library meant that I did not have to setup oAuth, instead I used my E-Mail and Password and the SkyDriveClient deals with the oAuth for me.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using HgCo.WindowsLive.SkyDrive;
namespace SkyDrive
{
public class Sky
{
private string Email;
private string Password;
private string RestorePath;
public Sky(string Email, string Password, string RestorePath)
{
this.Email = Email;
this.Password = Password;
this.RestorePath = RestorePath;
}
public void BackupTree()
{
var client = new SkyDriveServiceClient();
client.LogOn(this.Email, this.Password);
// Get root directory
WebFolderInfo wfInfo = new WebFolderInfo();
WebFolderInfo[] wfInfoArray = client.ListRootWebFolders();
client.Timeout = 1000000000;
foreach (WebFolderInfo dir in wfInfoArray)
{
Console.WriteLine(dir.Path);
CopyTree(client, dir, this.RestorePath + @"\" + dir.Name);
}
}
private void CopyTree(SkyDriveServiceClient client,
WebFolderInfo subDir, string HardDiskPath)
{
if (!Directory.Exists(HardDiskPath))
{
Directory.CreateDirectory(HardDiskPath);
}
WebFileInfo[] files = client.ListSubWebFiles(subDir);
foreach (WebFileInfo f in files)
{
using (Stream sr = client.DownloadWebFile(f))
{
string fileName = HardDiskPath + @"\" + f.Name;
if (!File.Exists(fileName))
{
using (FileStream fs = new FileStream(HardDiskPath
+ @"\" + f.Name, FileMode.OpenOrCreate))
{
byte[] buffer = new byte[64 * 1024];
int count = 0;
while ((count = sr.Read(buffer, 0, buffer.Length)) > 0)
fs.Write(buffer, 0, count);
}
}
}
}
WebFolderInfo[] wfSubInfoArray = client.ListSubWebFolders(subDir);
foreach (WebFolderInfo dir in wfSubInfoArray)
{
Console.WriteLine(dir.Path);
string sDir = HardDiskPath + @"\" + dir.Name;
CopyTree(client, dir, sDir);
}
}
}
}
Here are some other links for the RESTful interface to SkyDrive
Interactive SDK http://isdk.dev.live.com/dev/isdk/Default.aspx?mkt=en-us
SDK http://msdn.microsoft.com/en-US/live/ff621310