svn根据版本号查找文件并下载到本地

该博客展示了如何使用Java实现从SVN仓库根据版本号查找并下载特定文件到本地。代码示例中详细说明了如何设置SVN连接、遍历版本并执行导出操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

svn根据版本号查找文件并下载到本地
package com.mingya.util;

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.ISVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNUpdateClient;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

public class DisplayRepositoryTree {
		
	private static String url = "https://192.168.30.32/svn/R/r_erp/源码";
	private static String name = "zhuxb";
	private static String password = "zhuxb";
	private static SVNURL repositoryURL = null;
	private static SVNRepository repository = null;
	private static SVNClientManager ourClientManager=null;
	private static SVNUpdateClient updateClient=null;
    
	public void  execDownload(List<Integer> version){
		StringBuffer sb = new StringBuffer();
		Calendar ca = Calendar.getInstance();
    	StringBuffer year = new StringBuffer(""+ ca.get(Calendar.YEAR)+(ca.get(Calendar.MONTH)+1)+ca.get(Calendar.DATE));
    	File wcDir = new File("D:\\transfer\\"+year);
		if(wcDir.exists())
			wcDir.delete();
		//判断传入版本号
		if(version==null||version.size()==0){
			sb.append("版本号不能为空!");
		}else{
			//首先处理版本号
			 for(int i=0;i<version.size()-1;i++) {
				for(int j=1;j<version.size()-i;j++) {
				    Integer a;
				    if((version.get(j-1)).compareTo(version.get(j))>0) {   //比较两个整数的大小
				    a=version.get(j-1);
				    version.set((j-1),version.get(j));
				    version.set(j,a);
				    }
				}
			 }
			int len = version.size();
			 
	        DAVRepositoryFactory.setup();
	        try {
	        	repositoryURL=SVNURL.parseURIEncoded(url);
	            repository = SVNRepositoryFactory.create(repositoryURL);
	            
	            ISVNOptions options = SVNWCUtil.createDefaultOptions(true);  
				//实例化客户端管理类  
				ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, name, password);  
				//要把版本库的内容check out到的目录  
				//通过客户端管理类获得updateClient类的实例。  
				updateClient = ourClientManager.getUpdateClient();  
				updateClient.setIgnoreExternals(false);  
				
				ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
			    repository.setAuthenticationManager(authManager);
			    for(int i=0;i<len;i++){    
			    	sb.append(listEntries("",version.get(i),year.toString()));
			    }
	        } catch (SVNException svne) {
	            System.err.println("创建版本库实例时失败,版本库的URL是 '"+ url + "': " + svne.getMessage());
	            System.exit(1);
	        }
	        
	        long latestRevision = -1;
	        try {
	            latestRevision = repository.getLatestRevision();
	        } catch (SVNException svne) {
	            System.err
	                    .println("获取最新版本号时出错: "
	                            + svne.getMessage());
	            System.exit(1);
	        }
		}
		
		//写日志
		if(sb.length()>0){
			File file = new File("D:/svndownlog/"+year+".txt");
			//if(!file.exists()) file.mkdir();
			FileWriter writer=null;  
		    try {
		    	writer = new FileWriter(file); 
		    	writer.write(sb.toString());
		    	writer.flush();
		    	writer.close();  
			} catch (Exception e) {
				e.printStackTrace();
			}  
		    
		}
	}
	/*
     * 此函数递归的获取版本库中某一目录下的所有条目。
     */
    public static String listEntries(String path, int version,String year)
            throws SVNException {
    	StringBuffer sb = new StringBuffer();
        //获取版本库的path目录下的所有条目。参数-1表示是最新版本。
		
        Collection entries = repository.getDir(path, version, null,
                (Collection) null);
        Iterator iterator = entries.iterator();
        int size=0;
        while (iterator.hasNext()) {
            SVNDirEntry entry = (SVNDirEntry) iterator.next();
            if(entry.getRevision()==version){
	            if(entry.getKind()==SVNNodeKind.FILE){
		            System.out.println("/" + (path.equals("") ? "" : path + "/")
		                    + entry.getName()) ;
		            sb.append("第"+(size+1)+"个版本号"+version+"开始下载->>>>\n");
		            SVNURL u = SVNURL.parseURIEncoded(repositoryURL+"/"+path+"/"+entry.getName());
		            File fi = new File("D:/transfer/"+year+"/"+path+"/"+entry.getName());
					long workingVersion = 0;
					try {
						workingVersion = updateClient.doExport(u, fi, SVNRevision.HEAD,SVNRevision.parse(version+""), "downloadModel", true, false);
						//workingVersion = updateClient.doCheckout(u, fi, SVNRevision.HEAD, SVNRevision.parse(version+""), SVNDepth.INFINITY,false);
					} catch (SVNException e) {
						e.printStackTrace();
					}
					System.out.println("把版本:"+workingVersion+" check out 到目录:"+fi+"中。");  
					sb.append("第"+(size+1)+"个版本号"+version+"结束下载-<<<<\n");
					size++;
	            }
	            /*
	             * 检查此条目是否为目录,如果为目录递归执行
	             */
	            if (entry.getKind() == SVNNodeKind.DIR) {
	                listEntries((path.equals("")) ? entry.getName()
	                        : path + "/" + entry.getName(),version,year);
	            }
            }
        }
        return sb.toString();
    }
    
    public static void main(String[] args) {
    	List<Integer> version = new ArrayList<Integer>();
    	version.add(36724);
    	version.add(36718);
    	//version.add(e);
    	//version.add(e);
    	
    	DisplayRepositoryTree rt = new DisplayRepositoryTree();
    	rt.execDownload(version);
    }
}
 
代码下载见下方链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值