文件存在时,file.exists()返回false

6
在我正在开发的Android应用程序中,用户应该能够在SD卡上创建一个新的CSV文件,并使用他们在EditText中输入的文本来命名。
问题是,在使用目录和文件名实例化File之后,即使文件确实存在于该位置,file.exists()返回false。我已经通过Android文件浏览器和Windows资源管理器浏览到SD卡,文件确实存在。
这是检查文件是否已经存在的正确方法吗?如果是,那么我缺少什么使它在存在时返回true?
String csvname = edittext.getText().toString() + ".csv";
File sdCard = Environment.getExternalStorageDirectory(); //path returns "/mnt/sdcard"
File dir = new File (sdCard.getAbsolutePath() + "/Android/data/" + getPackageName() + "/files/"); // path returns "/mnt/sdcard/Android/data/com.phx.license/files"
dir.mkdirs();
File file = new File(dir, csvname); //path returns "/mnt/sdcard/Android/data/com.phx.license/files/Test.csv"

if(!file.exists()) //WHY DOES IT SAY IT DOESN'T EXIST WHEN IT DOES?
{
    ...
}

1
@Steven - 我正在使用Eclipse并对此进行了大量调试。观察file.exists(),它总是返回false,file.getAbsoluteFile().exists()也是如此。 - Gady
3
也许你没有该文件的读取权限?当你调用 .exists() 方法时,Java 的 SecurityManager 会检查读取权限。通常情况下,如果启用了 SecurityManager,则会抛出异常而不是正常返回结果,但我不知道在 Android 上它是如何工作的。 - Yoni
4
你应该真正使用File.separatorChar来代替硬编码斜杠。 - Erick Robertson
1
@Guddie - 那可能不是问题,但这是一个好的实践。 - Erick Robertson
2
请注意,由于外部数据目录的原因,每次您使用apt/Eclipse重新安装apk时,如果在API >= 8上运行,则会被擦除。实际上,我有一个2.2设备(LG Optimus one),在那里不会发生这种情况,但在模拟器上会发生。 - bigstones
显示剩余9条评论
3个回答

6
如果使用createNewFile,它只会在文件不存在时创建文件。 Java Files Documentation public boolean createNewFile() throws IOException 如果且仅当此抽象路径名指定的文件尚未存在时,则原子性地创建一个新的空文件。检查文件是否存在以及如果不存在则创建文件是一个与可能影响文件的所有其他文件系统活动具有原子性的单个操作。 注意:不应将此方法用于文件锁定,因为无法使得结果协议可靠工作。应改用FileLock工具。 返回值: 如果命名的文件不存在并成功创建,则返回true;如果命名的文件已经存在,则返回false。 异常: IOException-如果发生I/O错误 SecurityException-如果存在安全管理器并且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件的写访问 自: 1.2

4

创建一个新的文件对象,如 new File(dir, csvname); 并不会在文件系统中创建一个新文件。

您需要先将数据写入其中。


我的问题不在于创建文件,而是在创建(覆盖)之前检查它是否已经存在。 - Gady
如果文件存在,则exists()将返回true。 - jzd
那么File.exists()的正确用法是什么?如果不是用来检查文件对象是否存在,它的目的是什么? - Gady
5
@Guddie -- 你确定这个文件已经存在吗?你是怎么知道的?仅仅创建一个文件对象(new File(..))并不会创建文件本身。如果File.exists()返回false,那么文件就还不存在。你可以通过调用file.createNewFile()来创建它。 - Joe Krill
3
当我确定文件确实存在且是有效文件时,遇到了file.exists() == false的情况。 - Brill Pappin
显示剩余4条评论

0

我遇到了完全相同的问题,但是是在Hadoop上使用yarn时,一个Spark作业试图执行命令。

这是一个文件权限问题。我通过以下类似于Scala的代码进行了故障排除。exists和notExists都返回false,这意味着JVM无法判断文件是否存在。

import java.nio.file.Path
import java.nio.file.Paths

val path = Paths.get(fileLocation);
println(":"+ Files.exists(path)+ ":" + Files.notExists(path))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接