简易版WinZip
来源:互联网 发布:初识动画软件教学设计 编辑:程序博客网 时间:2024/04/25 17:13
- lsgZip.java
- import java.awt.BorderLayout;
- import java.awt.Container;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Toolkit;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipFile;
- import java.util.zip.ZipInputStream;
- import java.util.zip.ZipOutputStream;
- import javax.swing.AbstractButton;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JFileChooser;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JMenu;
- import javax.swing.JMenuBar;
- import javax.swing.JMenuItem;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JTable;
- import javax.swing.JToolBar;
- import javax.swing.ListSelectionModel;
- import javax.swing.filechooser.FileFilter;
- import javax.swing.filechooser.FileNameExtensionFilter;
- import javax.swing.table.DefaultTableModel;
- import javax.swing.JOptionPane;
- /**
- * 作者:李 世贵
- * JDK: 1.6
- * 来源: http://blog.csdn.net/lishigui
- * 欢迎转接,请保留作者和来源,谢谢!
- * 2008-9-28 上午09:49:06
- *
- */
- public class lsgZip extends JFrame{
- private static final long serialVersionUID = 1L;
- private int r=0;
- private int[] selectTableRow;
- private byte[] b=new byte[4096];
- private File file = null;
- private JTable table = null;
- private ZipEntry zipEntry = null;
- private JLabel labStatus = new JLabel();
- private String[] zipEntryInfo = new String[3];
- private MyTable defaultModel = null;
- private FileInputStream in = null;
- private ZipOutputStream zipfile;
- private JFileChooser filechooser = new JFileChooser();
- private String[] tableFields = {"文件名","路径","文件大小"};
- private FileFilter filter = new FileNameExtensionFilter("zip file","zip");
- public lsgZip() {
- super("李世贵简易版WinZip");
- Container container = getContentPane();
- container.setLayout(new BorderLayout());
- JMenuBarEven action = new JMenuBarEven();
- String[] emnuName ={"文件(F)@" + (int)'F', "操作(O)@" + (int)'O', "帮助(H)@" + (int)'H'};
- String[][]itemName = {{"新建(N)@" + (int)'N', "打开(O)@" + (int)'O', "退出(Q)@" + (int)'Q'}, {"添加(A)@" + (int)'A', "删除(D)@" + (int)'D', "解压(E)@" + (int)'E'}, {"手册(S)@" + (int)'S', "关于(A)@" + (int)'A'}};
- String[] name = {"把文件添加到压缩文件中", "解压压缩文件", "删除文件", "退出"};
- String[] image = {"image/Add.JPG", "image/Extract.JPG", "image/Delete.JPG", "image/Exit.JPG"};
- String[] text = {"添加", "解压", "删除", "退出"};
- this.setJMenuBar(createJMenuBar(emnuName, itemName, action));
- defaultModel = new MyTable(null, tableFields);
- table = new JTable(defaultModel);
- table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
- table.addMouseListener(new MouseAdapter(){
- public void mouseReleased(MouseEvent e){
- selectTableRow = table.getSelectedRows();
- }
- });
- this.addWindowListener(new WindowAdapter(){
- public void windowClosing(WindowEvent e){
- try {
- if(zipfile != null){
- zipfile.close();
- }
- } catch (IOException e1) {
- }
- System.exit(0);
- }
- });
- container.add(createJToolBar(name, image, null, action), BorderLayout.NORTH);
- container.add(new JScrollPane(table), BorderLayout.CENTER);
- container.add(createStatusbar(), BorderLayout.SOUTH);
- Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
- this.setLocation((int)(screensize.getWidth()-300)/2, (int)(screensize.getHeight()-400)/2);
- setSize(300,400);
- setVisible(true);
- }
- //创建JMnuBar
- private JMenuBar createJMenuBar(String[] menuName, String[][] itemName, ActionListener action) {
- JMenuBar bar = new JMenuBar();
- JMenu[] menu = new JMenu[menuName.length];
- for(int i = 0; i < menuName.length; i++){
- if(menuName[i].split("@").length > 1){
- menu[i] = new JMenu(menuName[i].split("@")[0]);
- menu[i].setMnemonic(Integer.parseInt(menuName[i].split("@")[1]));
- }else{
- menu[i] = new JMenu(menuName[i]);
- }
- JMenuItem[] item = new JMenuItem[itemName[i].length];
- for(int j = 0; j < itemName[i].length; j++){
- if(itemName[i][j].split("@").length > 1){
- item[j] = new JMenuItem(itemName[i][j].split("@")[0],Integer.parseInt(itemName[i][j].split("@")[1]));
- }else{
- item[j] = new JMenuItem(itemName[i][j]);
- }
- item[j].addActionListener(action);
- menu[i].add(item[j]);
- }
- bar.add(menu[i]);
- }
- return bar;
- }
- //创建JToolBar
- private JToolBar createJToolBar(String[] name, String[] image, String[] text,ActionListener action){
- JToolBar bar = new JToolBar();
- for(int i = 0; i < name.length; i++){
- JButton b = new JButton(new ImageIcon(this.getClass().getResource(image[i])));
- if(text!=null){
- b.setText(text[i]);
- b.setVerticalTextPosition(AbstractButton.BOTTOM);
- b.setHorizontalTextPosition(AbstractButton.CENTER);
- }
- if(name!=null){
- b.setToolTipText(name[i]);
- }
- b.addActionListener(action);
- bar.add(b);
- }
- return bar;
- }
- //创建Statusbar
- private JPanel createStatusbar(){
- JPanel statusbar = new JPanel();
- statusbar.setLayout(new FlowLayout(FlowLayout.LEADING));
- statusbar.add(labStatus);
- return statusbar;
- }
- //重写DefaultTableModel使它不能编辑
- class MyTable extends DefaultTableModel {
- public MyTable(Object[][] Info, String[] names){
- super(Info,names);
- }
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- return false;
- }
- }
- //侦听JMenuBar和JToolBar事件
- class JMenuBarEven implements ActionListener{
- public void actionPerformed(ActionEvent e) {
- //处理"新建"事件
- if(e.getActionCommand().equals("新建(N)")){
- newFile();
- }
- //处理"打开"事件
- if(e.getActionCommand().equals("打开(O)")){
- openFile();
- }
- //处理"退出"事件
- if(e.getActionCommand().equals("退出(Q)")){
- if(zipfile != null){
- try {
- zipfile.close();
- } catch (IOException e1) {}
- }
- lsgZip.this.dispose();
- System.exit(0);
- }
- //处理"添加"事件
- if(e.getActionCommand().equals("添加(A)")){
- if(zipfile == null ){
- newFile();
- addFile();
- }else{
- addFile();
- }
- }
- //处理"删除"事件
- if(e.getActionCommand().equals("删除(D)")){
- if(selectTableRow != null){
- r = selectTableRow.length;
- for(int i= 0; i < r; i++){
- defaultModel.removeRow(selectTableRow[r-i-1]);
- table.validate();
- }
- if(r > 0){
- delFile();
- }
- r = 0;
- }
- }
- //处理"解压"事件
- if(e.getActionCommand().equals("解压(E)")){
- if(selectTableRow != null ){
- if(selectTableRow.length > 0 ){
- unzip();
- }
- }
- }
- //处理"手册"事件
- if(e.getActionCommand().equals("手册(S)")){
- new helpDialog(lsgZip.this,"手册",false);
- }
- //处理"关于"事件
- if(e.getActionCommand().equals("关于(A)")){
- new aboutDialog(lsgZip.this,"关于",true);
- }
- //处理"JToolBar"事件
- if(e.getActionCommand().equals("")){
- JButton button = (JButton)e.getSource();
- if(button.getToolTipText().equals("把文件添加到压缩文件中")){
- if(zipfile == null ){
- newFile();
- addFile();
- }else{
- addFile();
- }
- }
- if(button.getToolTipText().equals("解压压缩文件")){
- if(selectTableRow != null ){
- if(selectTableRow.length > 0 ){
- unzip();
- }
- }
- }
- if(button.getToolTipText().equals("删除文件")){
- if(selectTableRow != null){
- r = selectTableRow.length;
- for(int i= 0; i < r; i++){
- defaultModel.removeRow(selectTableRow[r-i-1]);
- table.validate();
- }
- if(r > 0){
- delFile();
- }
- r = 0;
- }
- }
- if(button.getToolTipText().equals("退出")){
- if(zipfile != null){
- try {
- zipfile.close();
- } catch (IOException e1) {}
- }
- lsgZip.this.dispose();
- System.exit(0);
- }
- }
- }
- }
- //新建处理
- private void newFile(){
- try{
- filechooser.setFileFilter(filter);
- filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
- filechooser.setSelectedFile(new File("lsg.zip"));
- int result = filechooser.showDialog(lsgZip.this, "新建压缩文件");
- if ( result != JFileChooser.CANCEL_OPTION ){
- File newfile = filechooser.getSelectedFile();
- if(newfile.exists()){
- result = JOptionPane.showConfirmDialog(lsgZip.this, "文件已存在,是否覆盖现有的文件", "提示", JOptionPane.YES_NO_OPTION);
- if(result == JOptionPane.NO_OPTION){
- newFile();
- }
- if(result == JOptionPane.YES_OPTION){
- if(zipfile != null){
- zipfile.close();
- removeTableRow();
- }
- file = newfile;
- zipfile = new ZipOutputStream(new FileOutputStream(file));
- }
- }else{
- if(filechooser.getSelectedFile() != null){
- file = filechooser.getSelectedFile();
- if(zipfile != null){
- zipfile.close();
- removeTableRow();
- }
- zipfile = new ZipOutputStream(new FileOutputStream(file));
- }
- }
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //打开处理
- private void openFile(){
- try {
- filechooser.setFileFilter(filter);
- filechooser.setSelectedFile(null);
- filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
- int result = filechooser.showDialog(lsgZip.this, "打开压缩文件");
- if ( result != JFileChooser.CANCEL_OPTION ){
- File openfile = filechooser.getSelectedFile();
- if(openfile != null){
- startopen(openfile);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //开始执行打开处理
- private void startopen(File openfile) throws IOException{
- file = openfile;
- if(zipfile != null){
- try{
- zipfile.close();
- }catch(Exception e){}
- }
- removeTableRow();
- openfile = new File(file.getParent() + "/lsg.tem");
- if(openfile.exists()){
- openfile.delete();
- }
- file.renameTo(openfile);
- while(!openfile.exists()){
- file.renameTo(openfile);
- }
- zipfile = new ZipOutputStream(new FileOutputStream(file));
- ZipInputStream zipin = new ZipInputStream(new FileInputStream(openfile));
- zipEntry = zipin.getNextEntry();
- while(zipEntry != null){
- zipfile.putNextEntry(zipEntry);
- while((r = zipin.read(b, 0, 4096)) > -1){
- zipfile.write(b, 0, r);
- }
- getEntryInfo(zipEntry);
- zipEntry = zipin.getNextEntry();
- }
- zipin.close();
- openfile.delete();
- }
- //添加处理
- private void addFile(){
- try{
- filechooser.setFileFilter(null);
- filechooser.setSelectedFile(null);
- filechooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
- int result = filechooser.showDialog(lsgZip.this, "添加文件到压缩文件中");
- if(result == JFileChooser.CANCEL_OPTION){
- return;
- }
- File files = filechooser.getSelectedFile();
- zipfile.setMethod(ZipOutputStream.DEFLATED);
- if(files.isDirectory()){
- Visitor(files, files.getName(), zipfile);
- }else{
- zipEntry = new ZipEntry(files.getName());
- zipEntry.setSize(files.length());
- zipEntry.setTime(new Date().getTime());
- zipfile.putNextEntry(zipEntry);
- in = new FileInputStream(files);
- while((r = in.read(b,0,4096)) > 0){
- zipfile.write(b,0,r);
- }
- getEntryInfo(zipEntry);
- in.close();
- zipfile.closeEntry();
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //删除文件处理
- private void delFile(){
- try {
- File delfile = null;
- if(selectTableRow.length > 0){
- if(zipfile != null){
- try{
- zipfile.finish();
- zipfile.close();
- }catch(Exception e){}
- }
- delfile = new File(file.getParent()+"/lsg.tem");
- delfile.delete();
- file.renameTo(delfile);
- zipfile = new ZipOutputStream(new FileOutputStream(file));
- ZipFile filein = new ZipFile(delfile);
- InputStream in = null;
- for(int i = 0;i < table.getRowCount(); i++){
- zipEntry = filein.getEntry(defaultModel.getValueAt(i, 1).toString());
- zipfile.putNextEntry(zipEntry);
- in = filein.getInputStream(zipEntry);
- while((r = in.read(b, 0, 4096))>-1){
- zipfile.write(b, 0, r);
- }
- }
- if(in != null){
- in.close();
- }
- filein.close();
- delfile.delete();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //解压处理
- private void unzip(){
- try{
- filechooser.setFileFilter(null);
- filechooser.setSelectedFile(null);
- filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- int result = filechooser.showDialog(lsgZip.this, "解压");
- if(result == JFileChooser.CANCEL_OPTION){
- return;
- }
- File outfile = filechooser.getSelectedFile();
- String filetring;
- if(outfile.toString().endsWith("//")){
- filetring = outfile.toString();
- }else{
- filetring = outfile.toString() + "//";
- }
- if(file != null){
- zipfile.close();
- ZipFile zipin = new ZipFile(file);
- File f;
- File parent;
- InputStream in;
- FileOutputStream out = null;
- for(int i = 0; i < selectTableRow.length; i++){
- zipEntry = new ZipEntry(table.getValueAt(selectTableRow[i], 1).toString());
- f = new File(filetring + zipEntry.toString());
- parent = new File(f.getParent());
- if(!parent.exists()){
- parent.mkdirs();
- }
- in = zipin.getInputStream(zipEntry);
- out = new FileOutputStream(f);
- while((r = in.read(b, 0, 4096)) > -1){
- out.write(b, 0, r);
- }
- in.close();
- out.close();
- }
- zipin.close();
- File openfile = new File(file.toString());
- startopen(openfile);
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //将文件写到压缩文件
- private void Visitor(File directory, String entry, ZipOutputStream zipfile){
- try{
- File file = null;
- String[] fileList = directory.list();
- for(int i = 0; i < fileList.length; i++){
- file = new File(directory.toString() + "/" + fileList[i]);
- if(file.isDirectory()){
- Visitor(file, entry + "/" + file.getName(), zipfile);
- }else{
- zipEntry = new ZipEntry(entry + "/" + file.getName());
- zipEntry.setSize(file.length());
- zipEntry.setTime(new Date().getTime());
- zipfile.putNextEntry(zipEntry);
- in=new FileInputStream(file);
- while((r=in.read(b,0,4096))>0){
- zipfile.write(b,0,r);
- }
- getEntryInfo(zipEntry);
- in.close();
- zipfile.closeEntry();
- }
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //在Entry的信息插入table中显示
- private void getEntryInfo(ZipEntry entry){
- File file = null;
- file = new File(entry.toString());
- zipEntryInfo[0] = file.getName();
- zipEntryInfo[1] = entry.toString();
- if(entry.getSize()==-1){
- zipEntryInfo[2] = "未知";
- }else{
- zipEntryInfo[2] = entry.getSize() / 1024 + "." + entry.getSize() % 1024 + "K";
- }
- defaultModel.addRow(zipEntryInfo);
- table.validate();
- this.validate();
- }
- //删除表中所有的数据
- private void removeTableRow(){
- while(defaultModel.getRowCount()>0){
- defaultModel.removeRow(0);
- table.validate();
- }
- }
- public static void main(String[] args) {
- new lsgZip();
- }
- }
- helpDialog.java
- import java.awt.Container;
- import java.awt.FlowLayout;
- import java.awt.Frame;
- import javax.swing.JDialog;
- import javax.swing.JLabel;
- public class helpDialog extends JDialog {
- private static final long serialVersionUID = 1L;
- public helpDialog(Frame arg0, String arg1, boolean arg2) {
- super(arg0, arg1, arg2);
- Container container = getContentPane();
- container.setLayout(new FlowLayout(FlowLayout.LEFT));
- JLabel label = new JLabel();
- label.setText(
- "<html><h2 align=center><FONT color=blue>手册 </FONT></h2>" +
- "<p><FONT color=blue>新建压缩文件:</FONT>" +
- "<br>在菜单栏中选择"文件"->"新建",在弹出" +
- "<br>对话框中选择"新建压缩文件"的保存路径,然" +
- "<br>后输入"新建压缩文件"的文件名,默认的文件" +
- "<br>名是lag.zip.新建好压缩文件后就可以往"新" +
- "<br>建压缩文件"中添加多个文件夹或文件"+
- "<P><FONT color=blue>打开压缩文件:</FONT>" +
- "<br>在菜单栏中选择"文件"->"打开",在弹出对" +
- "<br>话框中选择要打开的压缩文件,单击打开,就可以" +
- "<br>打开压缩文件"+
- "<p><FONT color=blue>添加文件到压缩文件:</FONT>" +
- "<br>在菜单栏中选择"操作"->"添加"或者单击工" +
- "<br>具栏中的"添加",在弹出对话框中选择文件或文件" +
- "<br>夹添加到当前的压缩文件"+
- "<p><FONT color=blue>删除压缩文件中的文件:</FONT>" +
- "<br>在表中选择一个或者多个文件,然后单击菜单栏中选" +
- "<br>择"操作"->"删除"或者单击工具栏中的"删除"," +
- "<br>就可以删除选择中的文件了"+
- "<p><FONT color=blue>解压压缩文件:</FONT>" +
- "<br>在表中选择一个或者多个文件,然后单击菜单栏中选择" +
- "<br>"操作"->"解压"或者单击工具栏中的"解压"," +
- "<br>在弹出对话框中选择保存解压文件的路径,就可" +
- "<br>以解压选择中的文件了"+
- "<p><FONT color=blue>退出程序:</FONT>" +
- "<br>单击右上角的关闭,在菜单栏中选择"文件"->" +
- "<br>"退出",单击工具栏中的"退出"都能退出程序"+"</html>"
- );
- this.setResizable(false);
- container.add(label);
- setSize(390,550);
- setVisible(true);
- }
- }
- helpDialog.java
- import java.awt.Container;
- import java.awt.FlowLayout;
- import java.awt.Frame;
- import javax.swing.JDialog;
- import javax.swing.JLabel;
- public class helpDialog extends JDialog {
- private static final long serialVersionUID = 1L;
- public helpDialog(Frame arg0, String arg1, boolean arg2) {
- super(arg0, arg1, arg2);
- Container container = getContentPane();
- container.setLayout(new FlowLayout(FlowLayout.LEFT));
- JLabel label = new JLabel();
- label.setText(
- "<html><h2 align=center><FONT color=blue>手册 </FONT></h2>" +
- "<p><FONT color=blue>新建压缩文件:</FONT>" +
- "<br>在菜单栏中选择"文件"->"新建",在弹出" +
- "<br>对话框中选择"新建压缩文件"的保存路径,然" +
- "<br>后输入"新建压缩文件"的文件名,默认的文件" +
- "<br>名是lag.zip.新建好压缩文件后就可以往"新" +
- "<br>建压缩文件"中添加多个文件夹或文件"+
- "<P><FONT color=blue>打开压缩文件:</FONT>" +
- "<br>在菜单栏中选择"文件"->"打开",在弹出对" +
- "<br>话框中选择要打开的压缩文件,单击打开,就可以" +
- "<br>打开压缩文件"+
- "<p><FONT color=blue>添加文件到压缩文件:</FONT>" +
- "<br>在菜单栏中选择"操作"->"添加"或者单击工" +
- "<br>具栏中的"添加",在弹出对话框中选择文件或文件" +
- "<br>夹添加到当前的压缩文件"+
- "<p><FONT color=blue>删除压缩文件中的文件:</FONT>" +
- "<br>在表中选择一个或者多个文件,然后单击菜单栏中选" +
- "<br>择"操作"->"删除"或者单击工具栏中的"删除"," +
- "<br>就可以删除选择中的文件了"+
- "<p><FONT color=blue>解压压缩文件:</FONT>" +
- "<br>在表中选择一个或者多个文件,然后单击菜单栏中选择" +
- "<br>"操作"->"解压"或者单击工具栏中的"解压"," +
- "<br>在弹出对话框中选择保存解压文件的路径,就可" +
- "<br>以解压选择中的文件了"+
- "<p><FONT color=blue>退出程序:</FONT>" +
- "<br>单击右上角的关闭,在菜单栏中选择"文件"->" +
- "<br>"退出",单击工具栏中的"退出"都能退出程序"+"</html>"
- );
- this.setResizable(false);
- container.add(label);
- setSize(390,550);
- setVisible(true);
- }
- }
- aboutDialog.java
- import java.awt.Container;
- import java.awt.Dialog;
- import java.awt.FlowLayout;
- import java.awt.Frame;
- import java.awt.GraphicsConfiguration;
- import java.awt.Window;
- import javax.swing.JDialog;
- import javax.swing.JLabel;
- public class aboutDialog extends JDialog {
- public aboutDialog(Frame arg0, String arg1, boolean arg2) {
- super(arg0, arg1, arg2);
- Container container = getContentPane();
- container.setLayout(new FlowLayout(FlowLayout.LEFT));
- JLabel label = new JLabel();
- label.setText("<html><h3 align=center><FONT color=blue> 李世贵简易版WinZip</FONT></h3>" +
- "<b align=left><FONT color=blue> Version:</FONT>1.0</b>" +
- "<br><b align=left> <FONT color=blue>Author:</FONT> lishigui</b></html>");
- container.add(label);
- this.setResizable(false);
- setSize(180,150);
- setVisible(true);
- }
- }
- 该程序在我的资源网可以下载,欢迎你下载使用哦!
- 我的资源网地址是:http://lishigui.download.csdn.net/
程序运行的界面如下:
- 简易版WinZip
- WinRAR(WinZip)压缩与解压实现(C#版Window平台)
- winzip vs winrar
- WinRAR与Winzip
- Winzip压缩命令
- 放弃Winrar,改用WinZip
- WSH调用winzip命令进行打包压缩
- 让故事继续 WinZip发展历程回眸
- 用SOFTICE破解WINZIP的过程
- Other -- Winzip和Winrar命令行的使用
- 如何使用WinZip给图片加水印?
- JavaScript版简易计算器
- 简易版最长序列
- 简易版放大镜
- 简易版 jquery HttpClient
- 简易计算器完美版
- Day32_简易版ATM
- oracle简易版使用
- eclipseme开发j2me,Errors during build等
- 如何把多个文件写入到一个文件中去并能分解
- 在CSDN上开通了博客
- jakarta项目介绍
- 浅谈八皇后问题
- 简易版WinZip
- 三角形类
- After paper reading.......
- jakarta.commons包中BeanUtils以及ComparatorUtils的使用
- 坠入(Fall)赏析
- Visual Assist使用详细说明
- 哈哈,发现腾讯首页一个有趣的地方
- MySpace推出小企业及个人广告服务
- 电子书网址