我有一个c#UWP应用程序,它使用OneDrive API来存储 approot
(仅适用于我的应用程序的特殊文件夹)中的文件 . 我知道,我可以获得OneDrive this way的总空间,但它没有告诉我,我的应用程序需要多少空间 .
有没有一种快速的方法来告诉我的应用程序在那里存储这些文件需要多少空间(而不是遍历所有项目)?
我有一个c#UWP应用程序,它使用OneDrive API来存储 approot
(仅适用于我的应用程序的特殊文件夹)中的文件 . 我知道,我可以获得OneDrive this way的总空间,但它没有告诉我,我的应用程序需要多少空间 .
有没有一种快速的方法来告诉我的应用程序在那里存储这些文件需要多少空间(而不是遍历所有项目)?
2 回答
正如Brad所说,
approot
与任何其他OneDrive项目一样,都有元数据 . 在item的metadata中有一个size
属性,表示项目的大小(以字节为单位) . 因此,我们可以使用此属性来获取应用占用的总空间 .如App Folder所述,我们可以使用
GET /drive/special/approot
来获取您的应用文件夹的元数据,当使用OneDrive .NET SDK时,代码将如下:但是,正如我测试的那样,当我们在UWP中使用此代码时,我们将遇到缓存问题 . 即使您的应用程序文件夹的大小已更改,此API将返回与您第一次运行它时相同的值 .
这是因为在Get metadata for a OneDrive item时,它有一个可选的请求头
if-none-match
,如果包含此请求头并且提供的eTag(或cTag)与文件上的当前标记匹配,则返回HTTP 304 Not Modified
响应 .在UWP中,使用
HttpClient
将自动在请求中添加此标头,如果eTag
未更改,HttpClient
将无法获取最新信息,它将返回缓存的数据 . 根据Item resource type:所以在大多数情况下,app文件夹
eTag
不会改变,当我们在UWP中使用OneDrive .NET SDK或默认HttpClient
来获取app文件夹的元数据时,我们将获得缓存数据 . 为了清楚地看到这一点,我们可以使用fiddler来跟踪网络,我们会在请求 Headers 中找到If-None-Match
,OneDrive的真实响应是HTTP 304 Not Modified
.要解决此问题,我们可以使用带有HttpBaseProtocolFilter class和HttpCacheControl类的Windows.Web.Http.HttpClient类来禁用缓存,如下所示:
PS: 要使此方法有效,我们需要确保没有本地HTTP缓存 . 所以我们最好先卸载应用程序,不要在应用程序中使用
await oneDriveClient.Drive.Special.AppRoot.Request().GetAsync()
.当您获取应用程序的文件夹(通过
approot
)时,项目上返回的size
属性的值应该反映应用程序正在使用的空间量(因为对于文件夹,该值是存储的所有文件大小的总和在其中,任何级别) .