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

时间:2011-03-25 15:34:46

标签: java android file file-io

在我正在处理的Android应用程序中,用户应该能够在SD卡上创建一个新的CSV文件,使用他们在EditText中输入的文本命名。

问题是在使用目录和文件名实例化文件后,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?
{
    ...
}

3 个答案:

答案 0 :(得分:6)

如果您使用createNewFile,它只会创建一个尚未存在的文件。

Java Files Documentation

public boolean createNewFile()                       抛出IOException 当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。检查文件是否存在以及文件的创建(如果不存在)是针对可能影响文件的所有其他文件系统活动的原子操作。 注意:此方法不应用于文件锁定,因为无法使生成的协议可靠地工作。应该使用FileLock工具。

返回: 如果指定的文件不存在且已成功创建,则为true;否则为false。如果指定的文件已存在,则返回false 抛出: IOException - 如果发生I / O错误 SecurityException - 如果存在安全管理器且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件的写访问 以来: 1.2

答案 1 :(得分:4)

创建像new File(dir, csvname);这样的新文件对象不会在文件系统中创建新文件。

您需要先向其写入数据。

答案 2 :(得分:0)

我有完全相同的问题,但在hadoop上有一个火花作业试图执行命令的纱线。

这是文件许可问题。我通过下面的代码在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))