这个Java软件一共有两个类,下面是FileOperator类

/** *//**
*<pre>
*FileOperator
*@author 牟勇
*版本:0.0.1 Build 18
*创建日期:2007.6.6 20:36:03
*功能说明:完成文件的复制,删除等功能
*功能1:完成文件的复制
*功能2:完成文件的删除
*
*版本:0.0.2 Build 52
*修改日期:2007.6.6 16:12:26
*增加:写待同步文件根目录至指定文件中
*增加:同步文件的方法
*</pre>
*/
package com.speakmore.family.file;

import java.io.*;


public class FileOperator...{
static FileInputStream br;
static FileOutputStream bw;
static PrintWriter pw=null;

/** *//**
*copyFile
*复制源文件到目标文件
*@param targetFile 复制的目标文件名
*@param sourceFile 复制的源文件名
*@return 复制文件是否成功,true表示成功,false表示不成功
*如果源文件名是一个目录且目标文件名不存在,则创建它
*如果源文件名是一个目录且目标文件名存在,则忽略
*如果源文件名是一个文件且目标文件名不存在,则创建它
*如果源文件名是一个文件且比目标文件新,则覆盖它
*如果源文件名是一个文件且比目标文件旧,则忽略
*
*/

public static boolean copyFile(File targetFile,File sourceFile)...{
//如果源文件名是一个目录且目标文件名不存在,则创建它

if(sourceFile.isDirectory()&&!targetFile.exists())...{
System.out.println("目录且不存在:"+targetFile.toString());
targetFile.mkdirs();
return true;
}
//如果源文件名是一个目录且目标文件名存在,则忽略

if(sourceFile.isDirectory()&&targetFile.exists())...{
System.out.println("目录且存在:"+targetFile.toString());
return true;
}
//如果源文件名是一个文件且目标文件名不存在,则创建它

if(sourceFile.isFile()&&!targetFile.exists())...{
System.out.println("文件且文件不存在:"+targetFile.toString());
return writer(targetFile,sourceFile);
}
//如果源文件名是一个文件且比目标文件新,则覆盖它
if(sourceFile.isFile()&&sourceFile.lastModified()>

targetFile.lastModified())...{
System.out.println("文件且文件存在且要修改:"+targetFile.toString());
return writer(targetFile,sourceFile);
}
//如果源文件名是一个文件且比目标文件旧,则忽略
if(sourceFile.isFile()&&sourceFile.lastModified()<=

targetFile.lastModified())...{
System.out.println("文件且文件存在:"+targetFile.toString());
return true;
}
//如果前五种条件都不符合,则表示无法复制文件,返回false
return false;
}

/** *//**
*copyFile
*复制源文件到目标文件
*@param targetFilePath 复制的目标文件路径
*@param sourceFilePath 复制的源文件路径
*@return 复制文件是否成功,true表示成功,false表示不成功
*如果源文件名是一个目录且目标文件名不存在,则创建它
*如果源文件名是一个目录且目标文件名存在,则忽略
*如果源文件名是一个文件且目标文件名不存在,则创建它
*如果源文件名是一个文件且比目标文件新,则覆盖它
*如果源文件名是一个文件且比目标文件旧,则忽略
*/

public static boolean copyFile(String targetFilePath,String sourceFilePath)...{
return copyFile(new File(targetFilePath),new File(sourceFilePath));
}

/** *//**
*deleteFile
*删除目标文件
*@param targetFile 将被删除的文件
*@return true表示删除成功,false表示不成功
*/

public static boolean deleteFile(File targetFile)...{
return targetFile.delete();
}

/** *//**
*deleteFile
*删除目标文件
*@param targetFilePath 将被删除的文件路径
*@return true表示删除成功,false表示不成功
*/

public static boolean deleteFile(String targetFilePath)...{
return deleteFile(new File(targetFilePath));
}
//使用io对文件进行读写

private static boolean writer(File targetFile,File sourceFile)...{
String tempstr="";

try...{
br=new FileInputStream(sourceFile);
bw=new FileOutputStream(targetFile);
byte[] fileContent=new byte[1024];
int readed=0;
int readSum=0;

while((readed=br.read(fileContent))!=-1)...{
readSum+=readed;
bw.write(fileContent);
}
bw.close();
br.close();
return true;

}catch(Exception e)...{
e.printStackTrace();
return false;
}
}

/** *//**
*writeFileIndex
*将需要搜索的整个文件目录树写入指定的文件中
*@param filePath 需要搜索的文件根目录
*@param filename 指定的写入文件名
*@return 无
*/

public static boolean writeFileIndex(String filePath,String filename)...{
boolean flag=false;

try...{
//创建索引文件
pw=new PrintWriter(new BufferedWriter(
new FileWriter(filename)));

}catch(IOException e)...{
e.printStackTrace();
}
String[] temp=new File(filePath).list();
pw.println(filePath);

for(int i=0;i<temp.length;i++)...{

if(new File(filePath+File.separator+temp[i]).isFile())...{
pw.println(filePath+File.separator+temp[i]);
flag=true;
}

else...{
flag=writeFileIndex(filePath+File.separator+temp[i],filename);
}
}
pw.flush();
return flag;
}

/** *//**
*synFile
*同步文件
*@param sourcePath 源文件根目录
*@param targetPath 目标文件根目录
*@param filename 源文件目录树
*循环读取源文件,然后写入目标文件对应位置
*/

public static boolean synFile(String targetPath,String sourcePath,String filename)...{
boolean flag=false;

try...{
BufferedReader br=new BufferedReader(new FileReader(filename));
String file;

while((file=br.readLine())!=null)...{
//读取源文件索引列表
File sourceFile=new File(file);
System.out.println("源:"+file);
file=file.replace(sourcePath,targetPath);//换转为目标文件名
System.out.println("目标:"+file);
File targetFile=new File(file);//得到目标文件
flag=copyFile(targetFile,sourceFile);
}
br.close();

}catch(Exception e)...{
e.printStackTrace();
flag=false;
}
return flag;
}
}
下一个类是本软件的主类:FileSyn

/** *//**<pre>
*FileSyn
*@author 牟勇
*实现文件同步更新
*版本:0.0.1
*创建日期:2007.1.26 15:16:26
*实现:
*功能综述:实现从源文件夹到目标文件夹的同步更新
*功能1:根据文件的修改日期进行更新,如果源文件的修改日期大于目标文件的日期则进行替换
*功能2:如果源文件存在而目标文件不存在则在目标文件夹对应位置创建新文件
*功能3:如果源文件不存在而目标文件存在则删除目标文件(暂不提供此功能)
*
*@@@@@@@@@@@@@@@@@@@@@@@@
*包含文件:FileSyn.java
*功能说明:文件同步更新项目主文件,绝大部分功能均在些实现
*
*新增文件:FileOperator.java
*增添日期:2007.6.5 20:36:03
*功能说明:完成文件的复制,删除,创建等功能
*@@@@@@@@@@@@@@@@@@@@@@@@
*
**版本:0.0.2 Build 103
*修改日期:2007.1.30 11:04:59
*
*增加:将源文件夹中的文件读出并写入filenamelist.txt中
*修改:程序初始化显示位置
*增加:源文件夹和打开文件夹的浏览对话框选择
*增加:错误消息和成功消息
*
**版本:0.0.3 Build 55
*修改日期:2007.6.5 8:23:59
*
*修改:调整了读源文件列表,解决了递归不正确的Bug
*修改:调整了写目标文件,解决了无法写入的Bug
*修改:解决了一个关于不同系统之间文件分隔符的问题使跨平台使用成为可能(理论上,未测试)
*Bug:写目标文件会被写成文件夹
*Bug:在选择文件夹时,点击文件夹并不能选中文件夹,只能在点击文件时才能选中文件所在的文件夹
*</pre>
*/
package com.speakmore.family.file;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

public class FileSyn extends JFrame...{
private JTextField txtTarget;//目标文件夹
private JTextField txtSource;//源文件夹
private JLabel lblTarget;
private JLabel lblSource;
private JButton btnTarget;//选择源文件夹的按钮
private JButton btnSource;//选择目标文件夹的按钮
private JButton btnOk;//开始按钮
private JButton btnCancel;//取消按钮

public FileSyn()...{
this.getContentPane().setLayout(new GridLayout(3,1));
JPanel p1=new JPanel(new FlowLayout(FlowLayout.LEFT));//左对齐
lblSource=new JLabel("源文件夹");
txtSource=new JTextField(35);
btnSource=new JButton("浏览...");
p1.add(lblSource);
p1.add(txtSource);
p1.add(btnSource);
JPanel p2=new JPanel(new FlowLayout(FlowLayout.LEFT));
lblTarget=new JLabel("目标文件夹");
txtTarget=new JTextField(35);
btnTarget=new JButton("浏览...");
p2.add(lblTarget);
p2.add(txtTarget);
p2.add(btnTarget);
JPanel p3=new JPanel(new FlowLayout(FlowLayout.RIGHT,20,0));
btnOk=new JButton("确定");
btnCancel=new JButton("取消");
p3.add(btnOk);
p3.add(btnCancel);
this.add(p1);
this.add(p2);
this.add(p3);
this.setDefaultLookAndFeelDecorated(true);
this.setTitle("默然同步0.0.3");
this.setResizable(false);
this.setSize(550,150);
//获得当前屏幕的尺寸
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//获得当前窗口的尺寸
Dimension windowSize=this.getSize();
//窗口居中
this.setLocation((screenSize.width-windowSize.width)/2,
(screenSize.height-windowSize.height)/2);