无法检查SD卡上的文件是否存在

时间:2013-04-01 13:07:01

标签: android file

我正在尝试简单检查文件是否存在。我在这里看到了类似的问题,但他们没有帮助。当我运行我的应用程序时,应用程序崩溃,我得到消息“不幸的是,fileCheck1已经停止”。我在模拟器和智能手机上都出现了这个错误。

我的代码:

package com.example.fileCheck1;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;

import java.io.File;

public class MyActivity extends Activity {

    TextView msgText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        msgText = (TextView) findViewById(R.id.textView);
        String Path = Environment.getExternalStorageDirectory().getPath()+"/ping.xml";
        File file = getBaseContext().getFileStreamPath(Path);
        if(file.exists()){
            msgText.setText("Found");
        }
        if(!file.exists()){
            msgText.setText("Not Found");
        }
    }
}

在我的Manifest中有这样的权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

提前致谢。

3 个答案:

答案 0 :(得分:3)

我认为问题出在这里:

getBaseContext()

将其分配给 NULL 。你真的不需要这条线。您可以通过

简单地实现目标
String path = Environment.getExternalStorageDirectory().getPath() + "/ping.xml";
File f = new File(path);
if (f.exists()) {
   // do your stuff
}
else {
  // do your stuff
}

更新

如果您或其他人拥有三星Galaxy S3,请关注@ Raghunandan的回答,因为在这种情况下getExternalStorageDirectory()会返回内部内存。

答案 1 :(得分:3)

我有三星galaxy s3与android 4.1.2。我的内部手机内存名为sdcard0,外部卡名为extSdCard。

Environment.getExternalStorageDirectory()

因此上面返回sdcard0的路径,即内部手机内存

因此,获取您可以使用下面的实际路径

String externalpath = new String();
String internalpath = new String();

public  void getExternalMounts() {
Runtime runtime = Runtime.getRuntime();
try
{
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;

BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    if (line.contains("secure")) continue;
    if (line.contains("asec")) continue;

    if (line.contains("fat")) {//external card
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            externalpath = externalpath.concat("*" + columns[1] + "\n");
        }
} 
        else if (line.contains("fuse")) {//internal storage
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            internalpath = internalpath.concat(columns[1] + "\n");
        }
    }
}
}
catch(Exception e)
{
    e.printStackTrace();
}
  System.out.println("Path  of sd card external............"+externalpath);
  System.out.println("Path  of internal memory............"+internalpath);
}

一旦获得路径

    File file = new File(internalpath+"/ping.xml");// internalpath or external path
    if(file.exists()){
        msgText.setText("Found");
    }
    else{
        msgText.setText("Not Found");
    }

更新:

不建议使用上述解决方案。可能效果不好。 Environment.getExternalStorageDirectory()将始终返回外部存储路径。在大多数情况下,它是一张Sdcard。

来自文档

  

public static File getExternalStorageDirectory()

     

在API级别1中添加返回主外部存储目录。   如果已安装此目录,则该目录当前可能无法访问   由用户在他们的计算机上,已从设备中删除,或   还发生了一些其他问题。您可以确定其当前状态   使用getExternalStorageState()。

     

注意:不要在这里混淆“外部”这个词。这个目录   可以更好地被视为媒体/共享存储。它是一个文件系统   可以容纳相对大量的数据,并且可以共享   所有应用程序(不强制执行权限)。传统上这是   SD卡,但它也可以作为内置存储器实现   与受保护的内部存储区别的设备,可以是   作为文件系统安装在计算机上。

答案 2 :(得分:0)

检查一下:

    File file = new File(Environment.getExternalStorageDirectory()+"/ping.xml");
    if(file.exists()){
        msgText.setText("Found");
    }
    else{
        msgText.setText("Not Found");
    }