`

[原]导出CodeHelp的数据

阅读更多

搬到blogjava总得发点原创的东西吧。
    CodeHelp是专门为我们程序员设计的一款源代码管理软件。它能方便的管理您在编程和学习中有用的源代码,减少经常到处查找资料的劳动,节省您在开发中的时间和精力。这个软件不错,如果没有用过请到这里下载(http://www.nulldo.com/)。用了一段时间,发现它并没有文件导出功能。于是用Java写了一个CodeHelpExporter。
    下图为CodeHelp数据库表的关系,是用Visio导入Access反向分析得来的。有了这个图我们就可以编程了。



 



CodeHelpExporter.java源代码如下:

import java.sql.*;
import java.io.*;
/*
 *将CodeHelp数据库中的文件导出
 *@version 2009-3-15
 *@author Winty (wintys@gmail.com)
 */
class CodeHelpExporter{
    Database db;//数据库连接对象

    public CodeHelpExporter(String dbPath){
        db = new Database(dbPath);
        try{
            db.connect();
        }catch(SQLException sqle){
            sqle.printStackTrace();
        }
    }

    /**
     *主函数
     */
    public static void main(String[] args){
        String dbq = "helpdb.mdb";
        CodeHelpExporter exporter = new CodeHelpExporter( dbq );
        exporter.export();
    }

    /**
     *按CodeHelp的目录结构导出文章及其附件。
     *但有一点不同,就是不含任何内容的目录不会被创建。
     *文章会被导出到当前目录的CodeHelpExportedFiles目录下。
     */
    public void export(){
        try{
            String sql;
            sql = "SELECT T.NodeId AS id , T.ParentId AS parent ,";
            sql +="T.Type AS type,T.Title AS title , C.Content AS content ";
            sql +="FROM TContent C, TTree T WHERE T.NodeId = C.NodeId ";
            ResultSet rs = db.query(sql);

            while(rs.next()){
                int type = rs.getInt("type");
                if(type == 0)//如果是目录,则无操作
                    continue;

                int parent = rs.getInt("parent");
                int id = rs.getInt("id");
                String title = rs.getString("title");

                File fullParentPath = null;
                fullParentPath = parentPath(parent , "");
                fullParentPath = new File("CodeHelpExportedFiles/" +
                                                        fullParentPath.toString() );
               
                //读取附件的SQL
                String sql2 = "SELECT A.Title AS title , A.Data AS data ";
                sql2 += "FROM TAttachment A WHERE A.NodeId = " + id;
                ResultSet rs2=db.query(sql2);

                //判断文章有没有附件
                //如果文章没有附件则不创建目录,即文章不包含在目录中
                rs2.last();
                int num = rs2.getRow();
                String article;
                if(num > 0){
                    article = title + "/" ;
                }
                else{
                    article = "";
                }
                fullParentPath = new File(fullParentPath , article);
                if(!fullParentPath.exists())
                    fullParentPath.mkdirs();
                   
                //读取文章
                InputStream input = rs.getAsciiStream("content");
                readDataToFile(new File(fullParentPath ,  title + ".txt") , input);

                //读取文章的附件
                rs2.beforeFirst();
                while(rs2.next()){
                    String attachmentName = rs2.getString("title");
                    InputStream data = rs2.getBinaryStream("Data");
                    //将附件与其文章一同放在以文章名为目录名的目录中
                    readDataToFile(new File(fullParentPath , attachmentName) ,
                                            data);
                }
                rs2.close();
            }
            rs.close();

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                db.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    /**
     *从数据流中读取数据到文件
     *@param fileName 输出文件的文件名
     *@param input 数据输入流
     */
    private void readDataToFile(File filePath , InputStream input)
        throws IOException{
        FileOutputStream file = new FileOutputStream(filePath);
        BufferedOutputStream output = new BufferedOutputStream(file);

        byte[] buf = new byte[1024];
        int len;
        while((len = input.read(buf))!=-1){
            output.write(buf , 0 , len);
        }

        input.close();
        output.close();
    }

    /**
     *递归地构造目录(如果父目录存在的话)。即如果是子目录,则一直找到根目录才返回。
     *@param parent 父目录的ParentId
     *@param title 文件自身目录名,对于文章而言,path总是传入空字符串。
     *@return 返回构造后的目录(含从根目录一直到子目录的各级目录)
     */
    private File parentPath(int parent , String path)
        throws IOException , SQLException{
      
        if(parent == 0){//根目录
            File dir = new File(path);
            return dir;
        }
        else{
            String sql = "SELECT Title , ParentId  FROM TTree ";
            sql += "WHERE NodeId=" + parent;
            ResultSet rs = db.query(sql);
           
            if(rs.next()){
                String nodeTitle = rs.getString("Title");
                int nodeParent = rs.getInt("ParentId");
                path = nodeTitle + "/" + path;

                return parentPath(nodeParent , path);
            }
            rs.close();
        }

        return null;///
    }
}


Database.java:

import java.sql.*;
import java.io.*;

/**
 *数据库操作类,当前只适用于Access数据库。
 *@version 2009-3-15
 *@author wintys@gmail.com
 */
class Database{
    private Connection conn = null;
    private String dbPath = null;

    /**
     *构造方法
     *@param databasePath Access数据库的路径
     */
    public Database(String databasePath){
        dbPath = databasePath;
    }

    /**
     *连接数据库
     *@return 返回一个数据库连接Connection,如果连接数据库失败,返回null。
     */
    public Connection connect()
        throws SQLException{

        if(conn!=null)
            return conn;
       
        if(dbPath==null || dbPath.equals("")){
            conn = null;
            throw new SQLException("数据库路径错误!");
        }
       
        String url;
        //Microsoft Access数据库连接字符串
        url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=";
        url += dbPath;
       
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        conn = DriverManager.getConnection(url , "" , "");
       

        return conn;
    }

    /**
     *关闭数据库连接
     */
    public void close() throws SQLException{
        if(conn!=null)
            conn.close();
    }

    /**
     *执行查询,调用者要负责关闭结果集。
     *@param sql 要执行的SQL查询语句
     *@return 返回查询结果集
     */
    public ResultSet query(String sql) throws SQLException{
        Statement stmt;
        stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
                                                      ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery(sql);

        return rs;
    }
}

 

  • 大小: 71.1 KB
分享到:
评论

相关推荐

    CodeHelp 代码管理工具

    ★ CodeHelp是专门为我们程序员设计的一款源代码管理软件。...★ CodeHelp 能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。 ★ CodeHelp 中能够在数据库中按标题查找文章,并支持书签功能。

    CodeHelp源代码管理

    CodeHelp 是为了方便程序员更好的管理自己的源代码而写的一款免费软件。 利用 CodeHelp,可以方便的管理你的各种技术资料和源代码。 CodeHelp 以目录树来管理代码文件,你可以自由定义目录,并能够自由移动修改...

    CodeHelp方便的管理你的各种技术资料和源代码

    CodeHelp 是为了方便程序员更好的管 理自己的源代码而写的一款免费软件。 利用 CodeHelp,可以方便的管理你的各种技术资料和源代码。 CodeHelp 以目录树来管理代码文件,你可以自由定义目录,并 能够自由移动...

    codehelp

    CodeHelp是一款专为Visual Basic(VB)开发人员设计的插件工具,旨在提升VB编程环境的效率和用户体验。它提供了一系列实用的功能,帮助程序员更好地管理和优化VB代码,从而提高开发速度和代码质量。 首先,CodeHelp...

    源代码管理软件2.0(CODEHELP)

    "源代码管理软件2.0(CODEHELP)"是一款专为程序员设计的工具,旨在帮助他们有效地管理和组织收集到的各种编程语言的代码片段。这款软件利用ACCESS数据库作为存储后端,确保了数据的安全性和可靠性,同时提供了对多种...

    CodeHelp Unicode版2

    基于Thinkry的CodeHelp2.0,编译成了Unicode版本,非中文系统也不乱码了(此版本的源代码已邮件给Thinkry,版权归Thinkry所有) 修正了附件保存问题 简单介绍: CodeHelp是专门为我们程序员设计的一款源代码管理...

    一个管理自己代码的小工具codehelp

    开发者之间常常需要互相学习和交流,codehelp可能允许用户将代码片段导出或通过链接分享给他人,促进知识的传播和协作。 从压缩包的文件名称来看,"vcer.net.url"可能是codehelp的来源网址,用户可以通过这个链接...

    CodeHelp 代码生成器

    声明:本程序开源,可以任意修改、复制,可以不保留原作者信息。 开发环境:vs2005 程序是我在2007年利用每个周末写的,由于现在不从事ASP.NET方面的工作,而且比较懒,放着也是浪费,所以希望有兴趣的朋友为这个...

    CodeHelp2.0

    主要功能 ★ CodeHelp是专门为我们程序员设计的一款源代码管理...★ CodeHelp 能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。 ★ CodeHelp 中能够在数据库中按标题查找文章,并支持书签功能。

    CodeHelp 代码管理软件

    8. **安全与隐私**:考虑到代码的敏感性,CodeHelp 重视用户数据的安全,提供了加密存储和访问权限控制,确保只有授权的用户才能查看和编辑代码。 9. **备份与同步**:为了防止数据丢失,CodeHelp 提供自动备份和云...

    CodeHelp v2.2 简体中文版

    ≡≡≡≡≡≡≡≡≡≡≡≡≡『软件简介』≡≡≡≡≡≡≡≡≡≡≡≡≡ CodeHelp 是一款 VisualBasic IDE 环境的增强插件。 通过安装该软件,你可以让你的 VisualBasic IDE 拥有下列功能: 1.源代码编辑区...

    codehelp2.0版的自制abap语法着色文件

    自己写的xml文件,放在codehelp的syntex文件夹内即可实现对abap语言的语法着色

    CodeHelp2.2汉化版

    CodeHelp 是一款 VisualBasic IDE 环境的增强插件。 通过安装该软件,你可以让你的 VisualBasic IDE 拥有下列功能: 1.源代码编辑区支持全屏 2.源代码编辑区支持鼠标滚轮 3.像 VisualStudio 2003 一样支持标签化工作...

    CodeHelp_2.0_XiaZaiBa.zip

    在数据备份和导出方面,CodeHelp 2.0表现出色。它允许用户将所有笔记和相关文件打包成一个单一的文件,这个功能对于数据迁移或防止数据丢失至关重要。只需一键操作,就能将整个笔记库安全地保存到本地或云存储,方便...

    codehelp 代码管理工具

    CodeHelp是专门为我们程序员设计的一款源代码管理软件。它能方便的管理您在编程和学习中有用的源代码,减少经常到处查找资料的劳动,节省您在开发中的时间和精力。知识管理越来越被大家所重视,源代码也应该做为一种...

    codehelp 代码管理器

    **codehelp 代码管理器** 是一款专为程序员设计的高效工具,旨在简化代码的管理和检索过程。在软件开发过程中,开发者经常需要回顾和复用以前编写过的代码片段,这通常需要在各种文件和项目中搜索,费时费力。而**...

    codeHelp2.0

    3. 版本控制:CodeHelp2.0内置了版本控制系统,可以轻松追踪代码的修改历史,方便团队成员查看和恢复不同版本的代码,避免因误操作导致的数据丢失。 4. 协作与共享:为了支持团队协作,CodeHelp2.0提供了便捷的代码...

    CodeHelp v2.0 (源代码管理工具)

    ★ CodeHelp 能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。★ CodeHelp 中能够在数据库中按标题查找文章,并支持书签功能。 CodeHelp 2.0 新增功能·支持多个数据库文件,能够新建数据库、...

    CodeHelp2.0比较方便的源码管理程序

    5. **代码导入与导出**:支持从常见的代码托管平台(如GitHub、GitLab)或其他本地文件系统导入源代码,同时也能将代码导出为常见的代码文件格式,方便分享和备份。 6. **协作与分享**:CodeHelp或许还具备一定的...

Global site tag (gtag.js) - Google Analytics