为什么File.Exists返回false?

时间:2012-10-11 21:34:34

标签: android xamarin.android

我正在查询Android设备上的所有图片:

string[] columns = { MediaStore.Images.Media.InterfaceConsts.Data, 
            MediaStore.Images.Media.InterfaceConsts.Id };
string orderBy = MediaStore.Images.Media.InterfaceConsts.Id;
var imagecursor = ManagedQuery(MediaStore.Images.Media.ExternalContentUri, columns, null, null, orderBy);
for (int i = 0; i < this.Count; i++) {
    imagecursor.MoveToPosition(i);
    Paths[i]= imagecursor.GetString(dataColumnIndex);
    Console.WriteLine(Paths[i]);
    Console.WriteLine(System.IO.File.Exists(Paths[i]));
}

问题是输出显示某些文件不存在。这是一个示例输出:

  

/storage/sdcard0/Download/On-Yom-Kippur-Jews-choose-different-shoes-VSETQJ6-x-large.jpg
  假
  /storage/sdcard0/Download/397277_10151250943161341_876027377_n.jpg
  假
  /storage/sdcard0/Download/Roxy_Cottontail_&_Melo-X_Present..._Some_Bunny_Love's_You.jpg
  假
  /storage/sdcard0/Download/album-The-Rolling-Stones-Some-Girls.jpg
  真
  /storage/sdcard0/Download/some-people-ust-dont-appreciate-fashion[1].jpg
  真
  /storage/sdcard0/Download/express.gif
  真
  ...
  /storage/sdcard0/Download/some-joys-are-expressed-better-in-silence.JPG
  错误

这怎么可能?我自己从互联网上下载了这些图片!它们应该存在于磁盘中。

2 个答案:

答案 0 :(得分:0)

您似乎正在使用LoaderMananger / ManagedQuery来查询Android中的媒体内容提供商。 Content Provider只是一种从不同应用程序访问特定SQLite数据库的方法。如果您使用Android提供的媒体内容提供商,则必须使用MediaScannerConnection“手动”更新它,以添加您放置的新文件,因为在您的应用运行时,“服务”可能会在内部更新,也可能不会在内部更新

以下是一些相关的SO问题: Scan Android SD card for new filesTrigger mediascanner on specific path (folder), how to?但我不建议全局扫描SD卡的答案。

答案 1 :(得分:0)

如果这是三星设备,则所有这些路径可能都不正确!

//将其放入您的代码中,然后记录“外部”字符串以查看

String external = Environment.getExternalStorageDirectory();

如果你说:/ storage / sdcard0 /

然后三星自己说你必须做这个蹩脚的追加(我声称他们打破了API:)

external = external + "/external_sd/";

我不确定这是否适用于下载,但我怀疑它会影响所有类似的子路径。

http://developer.samsung.com/forum/board/thread/view.do?boardName=GeneralB&messageId=162934&messageNumber=1381&startId=zzzzz~&searchType=TITLE&searchText=sdcard

[编辑:]告诫Emptor!即使这在某些三星设备上也不起作用。 ARRRRGGGGGG