如何将Onedrive <item>的内容写入本地文件

时间:2016-05-08 01:02:42

标签: c# uwp win-universal-app windows-10-universal onedrive

在我的应用中,我使用OneDrive来保持数据同步。我成功地将文件写入OneDrive,但是没有运气用新的OneDrive数据替换本地过时的数据。

我的当前方法在不抛出异常的情况下完成,并不返回OneDrive上的文件所包含的相同文本数据。 该方法的目标是将datemodified与OneDrive文件与本地文件进行比较,如果OneDrive更新,则将OndeDrive文件的内容写入本地StorageFile,然后将其返回以进行反序列化。

private async Task<string> GetSavedDataFileAsync(string filename)
    {
        string filepath = _appFolder + @"\" + KOWGame + @"\" + filename;
        StorageFile localread;
        BasicProperties localprops = null;
        string txt;
        try
        {
            localread = await local.GetFileAsync(filepath);
            localprops = await localread.GetBasicPropertiesAsync();
        }
        catch (FileNotFoundException)
        { localread = null; }
        if (_userDrive != null)
        {
            if (_userDrive.IsAuthenticated)
            {
                try
                {
                    Item item = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync();
                    if (item != null)
                    {
                        DateTimeOffset drivemodified = (DateTimeOffset)item.FileSystemInfo.LastModifiedDateTime;
                        if (localprops != null)
                        {
                            if (drivemodified > localprops.DateModified)
                            {
                                Stream stream = await localread.OpenStreamForWriteAsync();
                                using (stream)
                                { await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync(); }
                            }
                        }
                    }
                }
                catch (OneDriveException e)
                {
                    if (e.IsMatch(OneDriveErrorCode.ActivityLimitReached.ToString()))
                    { string stop; }
                }
            }
        }
        if (localread == null) return string.Empty;
        txt = await FileIO.ReadTextAsync(localread);
        return txt;
    }

我试图反向设计我在Stack上找到的关于将StorageFile写入OneDrive的另一个答案,因为我需要打开本地文件的流,但我似乎没有正常工作。

1 个答案:

答案 0 :(得分:3)

要获取OneDrive项目的内容,我们需要使用以下方法:

var contentStream = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Content.Request().GetAsync();

使用

await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync();

您的OneDrive Item不是其内容。

因此,您可以像下面这样更改代码,将Onedrive项目的内容写入本地文件:

if (drivemodified > localprops.DateModified)
{
    using (var stream = await localread.OpenStreamForWriteAsync())
    {
        using (var contentStream = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Content.Request().GetAsync())
        {
            contentStream.CopyTo(stream);
        }
    }
}