如何在应用程序关闭时删除文件
How to delete file when application is closed
我想在我的应用程序关闭时删除一个文件。我在 activity 的 onDestroy
方法中执行删除。但是当我检查文件是否被删除时,关闭应用程序后,文件还在。
到目前为止,我的代码如下所示:
@Override
protected void onDestroy() {
File file = new File(Environment.getExternalStorageDirectory().getPath(), "fileName.txt");
if(file.exists()){
file.delete();
}
super.onDestroy();
}
编辑:要求显示有关创建临时文件的代码片段:
try {
file = File.createTempFile(Environment.getExternalStorageDirectory().getPath(), fileName);
} catch (IOException e) {
e.printStackTrace();
}
你不应该依赖 onDestroy
方法被调用(系统可以在生命周期到达这个阶段之前中断你的进程)。
我建议您使用临时文件夹来保存这样的文件,但您仍然有责任将临时文件的大小保持在合理的范围内 (~1 mb)。
UPDATE(关于临时文件片段)
您正在尝试提供 ExternalStorageDirectory
的完整路径作为文件名前缀。
但是这种方法有点不同。 File.createTempFile
函数除了使用随机名称在特殊的临时文件目录中创建文件外什么都不做。因此,我们仍然有责任提供一个临时文件夹,让系统知道这个文件适合删除:
public File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
}
cachedDir
是内部存储,这意味着其他应用程序不能在这里写文件,所以你应该实现FileProvider来提供你的临时文件的URI。
您可以尝试使用 Application 。您可以覆盖 onTerminate()
以删除您的文件。
我发现了几个与您创建文件的方式有关的潜在问题,特别是因为您想要删除它们。您也可以通过这种方式将文件存储在应用程序的本地缓存中。
// get the cache directory for our present `Activity`;
// referred to by `context`
File directory = context.getCacheDir();
File file = File.createTempFile("prefix", "extension", directory);
[Docs] 这些文件对您的应用程序是私有的,如果设备存储空间不足,Android 可以删除它们。虽然你不应该依赖于此。
您可能想看看 Android Activity Life-cycle
。因此,如果您跟踪在会话中创建的文件。删除 onDestroy()
中的这些文件。我建议将此列表保存为 SharedPref
或其他内容。原因? onDestroy()
并不是这个星球上最可靠的东西。如果您保存了文件,则可以在下次调用 onDestroy()
时删除它们(如果它们仍然存在)。
就个人而言,我可能不会为此目的使用 onDestroy()
。也许 onStop()
更可靠。这是你的设计,你将是最好的评判者。 :)
我想在我的应用程序关闭时删除一个文件。我在 activity 的 onDestroy
方法中执行删除。但是当我检查文件是否被删除时,关闭应用程序后,文件还在。
到目前为止,我的代码如下所示:
@Override
protected void onDestroy() {
File file = new File(Environment.getExternalStorageDirectory().getPath(), "fileName.txt");
if(file.exists()){
file.delete();
}
super.onDestroy();
}
编辑:要求显示有关创建临时文件的代码片段:
try {
file = File.createTempFile(Environment.getExternalStorageDirectory().getPath(), fileName);
} catch (IOException e) {
e.printStackTrace();
}
你不应该依赖 onDestroy
方法被调用(系统可以在生命周期到达这个阶段之前中断你的进程)。
我建议您使用临时文件夹来保存这样的文件,但您仍然有责任将临时文件的大小保持在合理的范围内 (~1 mb)。
UPDATE(关于临时文件片段)
您正在尝试提供 ExternalStorageDirectory
的完整路径作为文件名前缀。
但是这种方法有点不同。 File.createTempFile
函数除了使用随机名称在特殊的临时文件目录中创建文件外什么都不做。因此,我们仍然有责任提供一个临时文件夹,让系统知道这个文件适合删除:
public File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
}
cachedDir
是内部存储,这意味着其他应用程序不能在这里写文件,所以你应该实现FileProvider来提供你的临时文件的URI。
您可以尝试使用 Application 。您可以覆盖 onTerminate()
以删除您的文件。
我发现了几个与您创建文件的方式有关的潜在问题,特别是因为您想要删除它们。您也可以通过这种方式将文件存储在应用程序的本地缓存中。
// get the cache directory for our present `Activity`;
// referred to by `context`
File directory = context.getCacheDir();
File file = File.createTempFile("prefix", "extension", directory);
[Docs] 这些文件对您的应用程序是私有的,如果设备存储空间不足,Android 可以删除它们。虽然你不应该依赖于此。
您可能想看看 Android Activity Life-cycle
。因此,如果您跟踪在会话中创建的文件。删除 onDestroy()
中的这些文件。我建议将此列表保存为 SharedPref
或其他内容。原因? onDestroy()
并不是这个星球上最可靠的东西。如果您保存了文件,则可以在下次调用 onDestroy()
时删除它们(如果它们仍然存在)。
就个人而言,我可能不会为此目的使用 onDestroy()
。也许 onStop()
更可靠。这是你的设计,你将是最好的评判者。 :)