java - 在 Android 上检查文件的问题

标签 java android file io exists

我使用 File f = new File(s) 通过按下按钮创建一个新文件,并保存该文件。然后使用 .fileList()/getApplicationContext().fileList()(两者都有效)收集“保存”的文件,并在 for 循环中使用以保存到 ArrayList,然后将其传递给 ListView 的 ListAdapter。在适配器中,我设置了一个按钮来删除每个文件。我将日志放在代码的每个部分,当我按下一个按钮时,各个按钮和文件都会被识别,但在 f.exists() 中它总是返回 null。即使列表是使用收集的文件创建的,因此文件必须存在,它也始终返回 null。为什么是这样?我已经尝试调试 3 天了!

要从适配器中删除的代码(适配器中的其他所有内容均有效):

public void onClick(View v) {
    try {
        File f = new File(getChild(groupPosition, childPosition).toString());
        if (f.getAbsoluteFile().exists()) {
            f.delete();
            Log.d("delete", f.getAbsolutePath().toString() + " is deleted!");
        } else {
            Log.d("delete", f.getAbsolutePath().toString() + ": doesn't exist?");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

编辑: 试图删除数据目录中的所有文件(由=新文件创建的文件)

String [] filenames = getApplicationContext().fileList();
if (filenames.length > 0) {
    for (int i = 0; i < filenames.length; i++) {
        File f = new File(filenames[i]);
        Log.d("file selected:", f.getName());
        Log.d("file path:", f.getAbsolutePath().toString());
        if (f.exists()) {
            if (f.delete()) {
                Log.d("deleted:", f.getName());
            } else {
                Log.d("couldn't delete:", f.getName());
            }
        } else {
            Log.d("doesn't exist:", f.getName());
        }
    }
}

在堆栈跟踪中进行此操作:(+10 个其他)

12-16 21:31:11.187: D/file selected:(1270): new_recipe
12-16 21:31:11.187: D/file path:(1270): /new_recipe
12-16 21:31:11.187: D/doesn't exist:(1270): new_recipe
12-16 21:31:11.197: D/file selected:(1270): Untitled_Recipe
12-16 21:31:11.197: D/file path:(1270): /Untitled_Recipe
12-16 21:31:11.197: D/doesn't exist:(1270): Untitled_Recipe
12-16 21:31:11.197: D/file selected:(1270): hgk
12-16 21:31:11.197: D/file path:(1270): /hgk
12-16 21:31:11.197: D/doesn't exist:(1270): hgk

啊啊啊!

最佳答案

这种行为的原因是,File只是路径的包装 String并按需返回信息,例如 exists() .所以当你创建新的 File名称为“不存在”的 getName() 等仍然有效。

当您调用 new File("fileName") 时,实际上并没有在文件系统上创建任何内容

只有内存中的对象,然后你可以调用 file.createNewFile() 在指定位置创建空文件。

如果您通过 getApplicationContext().fileList() 获取文件这些文件在您的应用程序私有(private)存储中,并且是使用 getApplicationContext().openFileOutput("fileName", mode) 创建的,他们的真实路径是/data/data/<your package name>/files/<filename>.对于这些文件没有 File需要对象。创建、修改或删除。一切都应该通过 Context 处理和文件名。

关于java - 在 Android 上检查文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20611081/

相关文章:

C 程序声称文件不存在,但它是吗?

python - 比较列表和文本文件

java - java编译器是JVM的一部分吗?

java - 如何让进度条 Swing 进度?

java - 如何反序列化包含相同键名但使用不同类型的 JSON 文件(使用 Google JSON)?

java - 如何在 Java 记录器消息中插入制表符?

android - 如何将 Google Users API 与 Google App Engine 和 Android 一起使用

android - 即使我发送了一个 Intent ,OnActivityResult 也会在 Intent 通过时得到 null

android如何将捕获的图像保存到手机图库中

java - Java中通过分隔符行分割文件