【发布时间】:2012-03-02 11:27:58
【问题描述】:
在我的应用程序中,我将表格保存为图像。用户可以在打开文件(图像)后删除。当用户单击“打开”时,我使用以下代码打开图像:
File directory=new File(extStorageDirectory,File.separator+"myDirectory"+File.separator);
File fileInDirectory=new File(directory, fileName);
//I save the opened file's path n "filePath"
filePath=fileInDirectory.getAbsolutePath();
Bitmap bitmap = BitmapFactory.decodeFile(fileInDirectory.getAbsolutePath());
ImageView ivv=(ImageView) findViewById(R.id.imageView);
ivv.setImageBitmap(bitmap);
//I enable the delete button
deleteFile.setEnabled(true);
文件打开没有任何问题。当用户点击“删除”时,我会执行以下操作:
//I create a file using the filePath I saved earlier
File file=new File(filePath);
file.delete();
但它不会从 sdcard 中删除文件。我已经验证并且文件路径是正确的。我也试过 deleteFile(String) 函数:
deleteFile(fileNeme);
//fileName is the name of my file that I save earlier and I've verified it by printing it and there is no problem.
我放了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在我的清单文件中。所以我认为这不是权利问题,因为我可以从 sdcard 读写。
有没有办法做到这一点?
编辑: 这是我保存文件的代码。
this.save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder alert=new AlertDialog.Builder(LensCalculator.this);
alert.setTitle("Save");
alert.setMessage("Enter file name");
final EditText input=new EditText(MyActivity.this);
alert.setView(input);
alert.setPositiveButton("OK", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TableView table=(TableView) findViewById(R.id.tableId);
table.setDrawingCacheEnabled(true);
Bitmap b=table.getDrawingCache();
Canvas canvas=new Canvas(b);
canvas.drawBitmap(b, 0f, 175f, null);
OutputStream outStream = null;
String fileName=input.getText().toString();
File directory =new File(extStorageDirectory+File.separator+"myDirectory"+File.separator);
if(!directory.mkdir())
directory.mkdir();
File file = new File(directory, fileName);
try {
outStream = new FileOutputStream(file);
b.compress(Bitmap.CompressFormat.PNG, 100, outStream);
FileOutputStream fOut=openFileOutput("public.dat", Context.MODE_PRIVATE|Context.MODE_APPEND);
OutputStreamWriter osw=new OutputStreamWriter(fOut);
osw.write(fileName+"\n");
osw.close();
fOut.close();
outStream.close();
table.destroyDrawingCache();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
【问题讨论】:
-
检查
deleteFile()的返回值——它会告诉你它是否有效。此外,请确保删除文件时该文件未在任何地方打开;这可能会导致删除失败。 -
还有一个 deleteOnExit 可能不那么严格,允许安排删除打开的文件
-
@DavidGiven 我检查了 deleteFile 值,它是“假的”。打开文件后,我关闭了所有“流”。所以我不知道如何检查我的文件是否在某个地方打开:s.
-
@njzk2 不,在 Android 上这不起作用。它在文档中说“在 Android 上,应用程序生命周期不包括 VM 终止,因此调用此方法不会确保文件被删除。”
-
@njzk2 尝试使用 deleteOnExit() 但在我的情况下不起作用。可能是我用错了。我打开文件后添加了它。没有用所以我尝试在删除功能中添加它但没有效果。