如何访问我在外部创建的文件? AKA文件在哪里?

时间:2016-10-18 02:49:08

标签: java android file-io file-location

我正在尝试为SQLite数据库应用程序创建备份/恢复(导出/导入)过程。

虽然我似乎已经创建并填充了文件(好的,我现在知道我有)。我无法在DDMS中或Windows资源管理器中看到该文件。我真的希望能够做到后者(请参阅底部以获得更具体的问题)。

我已成功编写文件并使用以下代码读取文件:

package mjt.sqlitetutorial;

        import android.database.Cursor; //+++++ Added
        import android.os.Build;
        import android.os.Environment;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.util.Log;        //+++++ Added

        import java.io.BufferedOutputStream;
        import java.io.BufferedReader;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileOutputStream;
        import java.io.FileReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.OutputStreamWriter;



public class MainActivity extends AppCompatActivity {

    public int API_VERSION = Build.VERSION.SDK_INT;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (API_VERSION >= 23) {
            ExternalStoragePermissions.verifyStoragePermissions(this);
        }

        final String EXTSTGTAG = "EXTERNSTG";

        File file = getExternalFilesDir("File");
        Log.i(EXTSTGTAG,file.toString());
        //String extstgdirabs = Environment.getExternalStorageDirectory().getAbsolutePath();
        String extstgdirpth = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
        Log.i(EXTSTGTAG,"<=\nEXTERN STG PUB DIR=>" + extstgdirpth);
        String filepath = extstgdirpth + File.separator + "myfile.txt";
        Log.i(EXTSTGTAG,"Full File Path and name is\n\t" + filepath);

        File f = new File(filepath);
        if(!f.exists() ) {
            Log.i(EXTSTGTAG,"File did not exist (path=" + filepath + ")");
            try {
                f.createNewFile();
            }
            catch (IOException e) {
                Log.e(EXTSTGTAG,"Failure Creating New File MSG=" + e.getMessage());
            }
        }
        if(f.exists()) {
            Log.i(EXTSTGTAG,"File Already Exists (" + filepath + ")");
            try {
                Log.i(EXTSTGTAG,"Creating FileOutputStream instance.");
                FileOutputStream fos = new FileOutputStream(f);
                Log.i(EXTSTGTAG,"Creating OutputStreamWriter instance from FileOutputStream.");
                OutputStreamWriter osw = new OutputStreamWriter(fos);
                Log.i(EXTSTGTAG,"Adding Data to OutputStreamWriter.");
                osw.append("My Test Data.");

                Log.i(EXTSTGTAG,"Closing OutputStreamWriter.");
                osw.close();
                Log.i(EXTSTGTAG,"Flushing FileOutputStream.");
                fos.flush();
                Log.i(EXTSTGTAG,"Closing FileOutputStream");
                fos.close();
                Log.i(EXTSTGTAG,"All Done OK.");
            } catch (IOException e) {
                Log.e(EXTSTGTAG, "Failure Trying to write to file." + e.getMessage());
                e.printStackTrace();
            }
        } else  {
            Log.i(EXTSTGTAG,"File doesn't appear to exist when it should????");
        }
        f.setReadable(true);
        f.setWritable(true);
        if(f.exists()) {
            try {
                byte[] bytes;
                FileInputStream fis = new FileInputStream(f);
                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader br = new BufferedReader(isr);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
                }
                br.close();
                Log.i(EXTSTGTAG,"Read the following data:\n" + sb.toString());
            }
            catch (IOException e) {
                Log.e(EXTSTGTAG,"Failure trying to read file." + e.getMessage());
                e.printStackTrace();
            }
        }

    }
}

输出到日志(使用EXTERN作为过滤器)显示(注意安装App运行时的第一次运行失败但请求和设置权限。我不相信这是一个问题/原因): -

10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: /storage/emulated/0/Android/data/mjt.sqlitetutorial/files/File
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: <=
                                              EXTERN STG PUB DIR=>/storage/emulated/0/Download
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Full File Path and name is
                                                /storage/emulated/0/Download/myfile.txt
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: File Already Exists (/storage/emulated/0/Download/myfile.txt)
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating FileOutputStream instance.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating OutputStreamWriter instance from FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Adding Data to OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Flushing FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing FileOutputStream
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: All Done OK.
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: Read the following data:
                                              My Test Data.

最后一行表示它已经读取了文件(我假设)。在提供的消息中没有其他日志消息(尽管之前和之后很多)。

我正在测试它的设备是带有SD卡的非根HTC One M8s。但是,我相信 / storage / emulated / 0 / Download ,正在写入文件的目录位于内部存储器中。

使用DDMS我似乎无法看到这一点(实际的SD卡有一个Download s 目录而不是Download目录)。

在Windows资源管理器中,我可以将内部存储 SD卡视为 HTC_0PKV1 设备下的设备。

在Windows资源管理器中,下载目录(通过属性)0目录和文件。选择既不读也不隐藏。

我曾尝试使用setReadablesetWritable()

我刚尝试在手机上使用文件管理器,现在可以看到该文件了。更具体地说,问题是; 有没有办法排除手机根源并通过手机上的文件管理器移动文件,以通过Windows资源管理器访问该文件?

我还应该声明该应用程序将在平板电脑上运行,因此该方法应该是通用的,而不是特定于设备。

1 个答案:

答案 0 :(得分:0)

断开并重新连接USB电缆后,该文件在Windows资源管理器中可见。我不确定这个MTP是如何工作的,也可能是因为ADB可能是由于这个片段: -

  

但是,如果您曾试图解锁设备,例如   安装一个新的ROM或root它,然后你可能有一次或另一次   在您的计算机上安装了Android Debug Bridge(ADB)驱动程序。这个   驱动程序非常适合使用计算机发送命令   对你的设备,但它可能会搞砸你轻松的文件操作。

发现于How to Get Your Android Device to Show up in File Explorer (If It Isn’t)