Я не могу найти никакой документации, которая описывает правильный способ использовать OneDrive для хранения и сохранить приложение файлы syncrhonised различных устройств в C#Правильный способ использования OneDrive API для синхронизации файлов
Я прочитал документацию на OneDrive Dev Center но Я не понимаю http-код. (самообученный C# только).
Я понимаю, что я использую метод delta для получения измененных файлов из OneDrive, а затем сохраняю локально, но я не могу точно определить, как это сделать, поэтому обойти его, проверив локальный vs OneDrive вручную, используя GetAsync<>
методы. Моя текущая реализация (ниже для справки) кажется мне довольно неуклюжей по сравнению с тем, что, вероятно, лучше обрабатывается в API.
Кроме того, не существует функции обратного «дельта»? То есть, когда я пишу файл в приложение локально, тогда скажите OneDrive, чтобы синхронизировать изменение. Это потому, что мне нужно загрузить его с помощью метода PutAsync<>
? (В настоящее время, что я делаю)
public async Task<T> ReadFromXML<T>(string gamename, string filename)
{
string filepath = _appFolder + @"\" + gamename + @"\" + filename + ".xml";
T objectFromXML = default(T);
var srializer = new XmlSerializer(typeof(T));
Item oneDItem = null;
int casenum = 0;
//_userDrive is the IOneDriveClient
if (_userDrive != null && _userDrive.IsAuthenticated)
{
try
{
oneDItem = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync();
if (oneDItem != null) casenum += 1;
}
catch (OneDriveException)
{ }
}
StorageFile localfile = null;
try
{
localfile = await ApplicationData.Current.LocalFolder.GetFileAsync(filepath);
if (localfile != null) casenum += 2;
}
catch (FileNotFoundException)
{ }
switch (casenum)
{
case 0:
//neither exist. Throws exception to tbe caught by the calling method, which should then instantiate a new object of type <T>
throw new FileNotFoundException();
case 1:
//OneDrive only - should copy the stream to a new local file then return the object
StorageFile writefile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filepath, CreationCollisionOption.ReplaceExisting);
using (var newlocalstream = await writefile.OpenStreamForWriteAsync())
{
using (var oneDStream = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Content.Request().GetAsync())
{
oneDStream.CopyTo(newlocalstream);
}
}
using (var newreadstream = await writefile.OpenStreamForReadAsync())
{ objectFromXML = (T)srializer.Deserialize(newreadstream); }
break;
case 2:
//Local only - returns the object
using (var existinglocalstream = await localfile.OpenStreamForReadAsync())
{ objectFromXML = (T)srializer.Deserialize(existinglocalstream); }
break;
case 3:
//Both - compares last modified. If OneDrive, replaces local data then returns the object
var localinfo = await localfile.GetBasicPropertiesAsync();
var localtime = localinfo.DateModified;
var oneDtime = (DateTimeOffset)oneDItem.FileSystemInfo.LastModifiedDateTime;
switch (oneDtime > localtime)
{
case true:
using (var newlocalstream = await localfile.OpenStreamForWriteAsync())
{
using (var oneDStream = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Content.Request().GetAsync())
{ oneDStream.CopyTo(newlocalstream); }
}
using (var newreadstream = await localfile.OpenStreamForReadAsync())
{ objectFromXML = (T)srializer.Deserialize(newreadstream); }
break;
case false:
using (var existinglocalstream = await localfile.OpenStreamForReadAsync())
{ objectFromXML = (T)srializer.Deserialize(existinglocalstream); }
break;
}
break;
}
return objectFromXML;
}
Не уверен, что вы ищете. В Windows 10 есть папка с одним диском, которую вы можете настроить для синхронизации локальных файлов. –
Насколько я знаю, эта папка недоступна на телефонных устройствах, а только на рабочем столе (и, возможно, на планшетах, но у меня нет проверки). Тем не менее, цель состоит в том, чтобы сохранить данные на локальном устройстве, синхронизировать файл (ы) с OneDrive, чтобы другие устройства могли обновляться (и делать то же самое). Файлы данных слишком велики, чтобы использовать 'RoamingData'. – Lindsay
Существует C# sdk, который вы можете использовать, если хотите. https://github.com/onedrive/onedrive-sdk-csharp Следует иметь в виду, что один диск может хранить самую последнюю версию файла. Если вам нужно выполнить какую-либо синхронизацию (то есть объединить данные из локальной и одной версии диска), которые должны выполняться в вашем коде. –