file.exists() returning false when the file does exist
在我正在使用的Android应用程序中,用户应该能够在SD卡上创建一个新的CSV文件,并使用他们在EditText中输入的文本来命名。
问题在于,使用目录和文件名实例化File之后,即使文件确实存在于该位置,file.exists()也会返回false。 我已经使用Android文件浏览器和Windows资源管理器浏览到SD卡,并且该文件确实存在。
这是检查文件是否已经存在的正确方法吗?如果存在,我会丢失什么内容,以便在文件存在时返回true?
1 2 3 4 5 6 7 8 9 10
| 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?
{
...
} |
-
每次getPackageName()都会返回相同的东西吗?
-
@Briedis是的,目录存在
-
@ Tahir Akhtar-getPackageName()每次都返回相同的东西,因为它总是从同一包中调用
-
我的建议是在调试器中运行它(或将其输出到控制台),并查看每个方法返回的确切信息。
-
@Steven-我正在使用Eclipse,并且已经调试好了这个东西。看着file.exists(),它总是返回false,就像file.getAbsoluteFile()。exists()一样。
-
也许您没有对该文件的读取权限?调用.exists()时会涉及Javas SecurityManager,它会检查读取权限。通常,如果启用了SecurityManager,则在这种情况下会出现异常,而不是正常返回,但是我不知道它在Android上如何工作
-
您应该真正使用File.separatorChar而不是使用斜杠对其进行硬编码。
-
@Yoni我已将添加到清单文件中。据我所知,这就是应用程序访问文件系统所需的全部。
-
@Erick-感谢您的建议,我会试一下
-
@Guddie-那可能不是问题,而是它的良好实践。
-
作为外部数据目录,请注意,每次使用apt / Eclipse重新安装apk时,如果在API> = 8上运行,它将被擦除。实际上,我有一个2.2设备(LG Optimus 1),它不会在那里发生,但是会在模拟器上发生。
-
@bigstones是的,我应该将文件写入非特定于应用程序的位置。
-
为什么不尝试使用String.valueOf(file)打印出文件路径,并查看文件路径是否正确。通过将所有路径连接在一起而创建的文件路径可能是错误的。 file.exists()不应返回错误的结果,因此其他某些地方一定是错误的。
-
在adb中,发出cd sdcard; touch testfile,然后替换File dir = new File (sdCard.getAbsolutePath());和String csvname ="testfile";。重新编译并运行。 file.exists()现在应该返回true。发布调试结果。
-
在我工作的三星银河S上,Environment.getExternalStorageDirectory();将路径返回到内部闪存mntsdcard。实际的外部sd卡已安装在mntsdcardsd上。这可能是问题吗?
如果使用createNewFile,它将仅在尚不存在的情况下创建一个文件。
Java文件文档
公共布尔createNewFile()
引发IOException
当且仅当具有该抽象路径名的文件尚不存在时,以原子方式创建一个新的空文件。检查文件是否存在以及如果文件不存在则创建文件是单个操作,对于可能影响该文件的所有其他文件系统活动而言,这是原子操作。
注意:此方法不应用于文件锁定,因为不能使生成的协议可靠地工作。应该改用FileLock工具。
返回值:
如果命名文件不存在且已成功创建,则为true;否则为true。如果命名文件已经存在,则返回false
抛出:
IOException-如果发生I / O错误
SecurityException-如果安全管理器存在并且其SecurityManager.checkWrite(java.lang.String)方法拒绝对该文件的写访问
以来:
1.2
像new File(dir, csvname);这样创建新文件对象不会在文件系统中创建新文件。
您需要先向其中写入数据。
-
我的问题不是创建文件,而是在创建(在这种情况下,覆盖)文件之前检查它是否已经存在。
-
如果文件确实存在,则exists()将返回true。
-
问题是,如果运行FileOutputStream f = new FileOutputStream(file);创建文件,则该文件存在(如果存在),因此除非文件尚不存在,否则我不想创建该文件。
-
我了解,但如果存在,该方法将返回true。如果不是这种情况,可以提供SSCCE吗?我对此表示怀疑,这意味着您的问题不是存在于代码中的其他位置的exist()。
-
那么File.exists()的正确用法是什么?如果不检查File对象是否存在,它的目的是什么?
-
@Guddie-您绝对确定此文件已经存在吗?你怎么知道的?仅创建文件对象(new File(..))不会创建文件本身。如果File.exists()返回false,则文件不存在。您可以通过调用file.createNewFile()来创建它。
-
@Joe K-你赢了!如果文件不存在,则调用file.createNewFile()会创建该文件,如果存在则返回false。然后在调用File.exists()之后返回true。我相信这也是jzd想要说的。
-
@Joe K-您介意将解决方案发布为答案,以便我将其标记为已回答吗?
-
我完全确定文件确实存在并且是有效文件时,我遇到了file.exists()== false。
我遇到了完全相同的问题,但是在hadoop上运行了纱,火花作业试图执行命令。
这是一个文件权限问题。我通过下面的代码在scala中对它进行了故障排除。存在和notExists都返回false,这意味着jvm无法判断文件是否存在。
1 2 3 4 5
| import java.nio.file.Path
import java.nio.file.Paths
val path = Paths.get(fileLocation);
println(":"+ Files.exists(path)+":" + Files.notExists(path)) |