【问题标题】:How to correctly get the file size of an android.net.Uri?如何正确获取 android.net.Uri 的文件大小?
【发布时间】:2014-02-19 13:44:03
【问题描述】:

我有一个 android.net.Uri 指向一个我需要确定文件大小的文件。目前这是使用 contentResolver 上的查询完成的(我使用的是 Xamarin,所以它是 C#):

var cursor = contentResolver.Query(uri, new string[] {
    Android.Provider.OpenableColumns.Size,
    Android.Provider.OpenableColumns.DisplayName 
}, null, null, null);
cursor.MoveToFirst();
size = cursor.GetLong(0);
fileName = cursor.GetString(1);
cursor.Close();

这在大多数情况下都有效,但对于某些文件,该值似乎比正确的文件大小略大(我使用 Total Commander 作为参考)。

必须有更好的方法来做到这一点,我真的需要确切的大小信息,并且由于文件很大,不能先将它们读入内存。为什么我的方法会产生不正确的结果?

提前感谢您的帮助。

【问题讨论】:

标签: c# java android xamarin


【解决方案1】:

虽然我没有找到查询返回错误结果的原因,但我找到了另一种获取文件大小的方法,似乎可行:

using (var fd = contentResolver.OpenFileDescriptor(uri, "r"))
    size = fd.StatSize;

【讨论】:

  • 当您使用光标阅读时,您正在查看内存中的数据流。这意味着您获得的大小是流的大小。我最好的选择是,有时您会因为光标请求内存的方式而得到填充(“讨厌”的东西 .net 托管代码会努力向我们隐藏)。在您的解决方案中,您使用的是明确包含文件元数据的描述符,它给出了正确的值并且是正确的方法。
  • 我相信这与 .net 的东西无关,我将此归咎于谷歌。我在原生 android 上面临同样的问题,请检查:stackoverflow.com/questions/48302972/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多