如何在Android中使用file observer删除文件?
我正在尝试使用file Observer删除文件。在我的代码中,如果任何文件被推入SD卡,它将触发一个create事件。在那个事件中,我想删除那个文件。我正在尝试下面提供的代码,但无法删除该文件,因为正在进行文件复制。因此,我现在想在文件成功复制到SD卡后删除该文件 当文件成功复制到SD卡时,是否有触发事件的通知如何在Android中使用file observer删除文件?,android,file,sd-card,fileobserver,Android,File,Sd Card,Fileobserver,我正在尝试使用file Observer删除文件。在我的代码中,如果任何文件被推入SD卡,它将触发一个create事件。在那个事件中,我想删除那个文件。我正在尝试下面提供的代码,但无法删除该文件,因为正在进行文件复制。因此,我现在想在文件成功复制到SD卡后删除该文件 当文件成功复制到SD卡时,是否有触发事件的通知 public class RecursiveFileObserver extends FileObserver { /** Only modification even
public class RecursiveFileObserver extends FileObserver
{
/** Only modification events */
public static int CHANGES_ONLY = CREATE | DELETE | CLOSE_WRITE | MOVE_SELF
| MOVED_FROM | MOVED_TO;
List<SingleFileObserver> mObservers;
String mPath;
int mMask;
Context mContext;
public RecursiveFileObserver(String path, Context context)
{
this(path, ALL_EVENTS, context);
}
public RecursiveFileObserver(String path, int mask, Context context)
{
super(path, mask);
mPath = path;
mMask = mask;
mContext = context;
}
@Override
public void startWatching()
{
if (mObservers != null)
return ;
mObservers = new ArrayList();
Stack stack = new Stack();
stack.push(mPath);
while (!stack.isEmpty())
{
String parent = String.valueOf(stack.pop());
mObservers.add(new SingleFileObserver(parent, mMask));
File path = new File(parent);
File[]files = path.listFiles();
if (null == files)
continue;
for (File f: files)
{
if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals(".."))
{
stack.push(f.getPath());
}
}
}
for (SingleFileObserver sfo: mObservers)
{
sfo.startWatching();
}
}
@Override
public void stopWatching()
{
if (mObservers == null)
return ;
for (SingleFileObserver sfo: mObservers)
{
sfo.stopWatching();
}
mObservers.clear();
mObservers = null;
}
@Override
public void onEvent(int event, String path)
{
switch (event)
{
case FileObserver.CREATE:
Log.i("RecursiveFileObserver", "CREATE: " + path);
File file = new File(path);
Log.d("File length "," file length = "+file.length());
if(file.exists()){
boolean deleted = file.delete();
Log.d("File Deteted "," file Delete = "+deleted);
}
break;
}
}
/**
* Monitor single directory and dispatch all events to its parent, with full path.
*/
class SingleFileObserver extends FileObserver
{
String mPath;
public SingleFileObserver(String path)
{
this(path, ALL_EVENTS);
mPath = path;
}
public SingleFileObserver(String path, int mask)
{
super(path, mask);
mPath = path;
}
@Override public void onEvent(int event, String path)
{
String newPath = mPath + "/" + path;
RecursiveFileObserver.this.onEvent(event, newPath);
}
}
}
public class TestFileObserverActivity extends Activity {
RecursiveFileObserver mObserver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mObserver = new RecursiveFileObserver(Environment.getExternalStorageDirectory().getAbsolutePath(), RecursiveFileObserver.CREATE, this);
mObserver.startWatching();
Toast.makeText(getApplicationContext(), "Watching " + Environment.getExternalStorageDirectory().getAbsolutePath(), Toast.LENGTH_LONG).show();
}
}
请帮帮我。提前感谢。据我所知,无法知道文件何时完成复制。但我可以想到一个解决办法。在create事件中,尝试放置一个timertask,每3秒检查一次文件完成情况。或者尝试每3秒钟删除一次,直到它不存在,然后将timertask从计时器队列中移除。这样,它将不断删除复印机所做的操作,直到文件不再存在
希望对您有所帮助。可以将file observer所基于的底层linux inotify mechansim设置为在关闭打开以进行写入的文件时报告关闭写入事件。不确定file observer是否可以做到这一点,或者直接从本机代码使用inotify是否有任何障碍。如果file observer不支持,这里建议的等待可能更简单。但正如我上面所说的,整个项目似乎是个坏主意。你是对的。我完全忘了写这封信。文件观察者不支持CLOSE_WRITE;就像使用CREATE一样切换它,它就会工作。一个侧重点。。。设置递归文件观察程序需要时间。如果您有一个用户界面,我会在递归文件观察器类中执行start-watching命令,这样它就不会绑定ui线程。