论坛首页 入门技术论坛

Java 中强制删除文件的方法

浏览 19842 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-08-21  
在系统开发时,有时需要在程序中把正在用到plugin文件删除,重新更新。这需要首先在java程序中停止使用这个plugin文件,然后删除,重新更新。我在开发是遇到这样的问题,在java中停止使用了plugin文件,但是在用过FileObj.delete时,返回false,在文件系统中删除plugin文件时,OS报错,说该文件正在使用中,等几秒中在删除就可以删除了。

我猜想可能是java已经不用该plugin文件了,但是OS还认为该文件还在被使用,所以报错,所以就写了个方法来强制删除改文件,不知道这样写有没有什么不妥?欢迎来拍砖!
     /**
	 * try to delete given file , try 10 times
	 * @param f
	 * @return true if file deleted success, nor false;
	 */
	public static boolean forceDelete(File f)
	{
	    boolean result = false;
	    int tryCount = 0;
	    while(!result && tryCount++ <10)
	    {
		logger.debug("try to delete file "+ f.getName() +" cnt:"+tryCount);
		System.gc();
		result = f.delete();
	    }
	    return result;
	}
   发表时间:2007-08-21  
commons io里面的FileUtils类有很多的类似删除的方法,如
FileUtils.forceDelete(file)

0 请登录后投票
   发表时间:2007-08-21  
以下是commons-io里forceDelete的源码,它满足不了我上面说的需求
/**
     * Delete a file. If file is a directory, delete it and all sub-directories.
     * <p>
     * The difference between File.delete() and this method are:
     * <ul>
     * <li>A directory to be deleted does not have to be empty.</li>
     * <li>You get exceptions when a file or directory cannot be deleted.
     *      (java.io.File methods returns a boolean)</li>
     * </ul>
     *
     * @param file  file or directory to delete, must not be <code>null</code>
     * @throws NullPointerException if the directory is <code>null</code>
     * @throws IOException in case deletion is unsuccessful
     */
    public static void forceDelete(File file) throws IOException {
        if (file.isDirectory()) {
            deleteDirectory(file);
        } else {
            if (!file.exists()) {
                throw new FileNotFoundException("File does not exist: " + file);
            }
            if (!file.delete()) {
                String message =
                    "Unable to delete file: " + file;
                throw new IOException(message);
            }
        }
    }
0 请登录后投票
   发表时间:2007-08-21  
楼主,System.gc()调用以后不适立刻就进行垃圾回收的,如果不是对跨平台要求严格看是否能用java调用系统的强行删除命令。别的办法我也不知道了
0 请登录后投票
   发表时间:2007-08-21  
这样10次太快了吧,可能还是删不掉,建议再加一个Thread.sleep(1000)?
0 请登录后投票
   发表时间:2007-08-22  
我尝试过多次,一般情况下cnt=1时就能删除,现在cnt最大只是到5就结束了
0 请登录后投票
   发表时间:2007-08-22  
Ivan Li 写道
我尝试过多次,一般情况下cnt=1时就能删除,现在cnt最大只是到5就结束了

加上超时代码吧。。。否则真的要是删到了系统文件就卡死了。
PS:gc是作什么用的?
去了是否就删不去了?
0 请登录后投票
   发表时间:2007-08-22  
是不是应该从classloader的实现入手?看载入jar时对底层文件是否加锁了?


http://blog.taragana.com/index.php/archive/how-to-unload-java-class/
0 请登录后投票
   发表时间:2008-06-05  
牛!我用可以啦,System.gc()很有用
0 请登录后投票
   发表时间:2008-06-13  
如果现在删除了.那么后面其他程序用到 该怎么处理呢
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics