这个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
*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);
this.setVisible(true);
//******************************************************************************
// 事件监听部分
//******************************************************************************
//单击Window窗体关闭按钮的事件监听:退出程序
this.addWindowListener(new WindowAdapter()...{
public void windowClosing(WindowEvent e)...{
System.exit(0);
}
});
//执行文件同步的事件监听
btnOk.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e)...{
if(!txtSource.getText().trim().equals("")
&&!txtTarget.getText().trim().equals(""))...{
btnOk.setEnabled(false);
if(FileOperator.writeFileIndex(txtSource.getText(),"source.txt"))...{
JOptionPane.showMessageDialog(null,"源文件索引完成");
}
//开始同步文件夹
if(FileOperator.synFile(txtTarget.getText(),txtSource.getText(),"source.txt"))...{
JOptionPane.showMessageDialog(null,"文件同步完成");
}
btnOk.setEnabled(true);
}else...{
JOptionPane.showMessageDialog(null,"请输入源文件夹或目标文件夹");
return;
}
}
});
//取消按钮的事件监听:退出程序
btnCancel.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e)...{
System.exit(0);
}
});
//选择源文件夹路径的事件监听:打开文件对话框
btnSource.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e)...{
FileDialog source=new FileDialog(FileSyn.this,"源文件夹");
source.show(true);
if(source.getDirectory()!=null)
txtSource.setText(source.getDirectory());
}
});
//选择目标文件夹路径的事件监听:打开文件对话框
btnTarget.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e)...{
FileDialog target=new FileDialog(FileSyn.this,"目标文件夹");
target.show(true);
txtTarget.setText(target.getDirectory());
}
});
}
public static void main(String[] args)...{
new FileSyn();
}
}
嗯,多的就不说了吧?因为我觉得自己的注释还是写得蛮清楚的了。
我做了初步测试,尚做全面测试,希望有热心的朋友帮我测试一下呀,先谢啦~
您好:
当您在阅读和使用我所提供的各种内容的时候,我非常感谢,您的阅读已是对我最大的支持。
我更希望您能给予我更多的支持。
1.希望您帮助我宣传我的博客,让更多的人知道它,从中获益(别忘记了提醒他们帮我点点广告,嘿嘿)。
2.希望您能多提出宝贵意见,包括我所提供的内容中的错误,建设性的意见,更希望获得哪些方面的帮助,您的经验之谈等等。
3.更希望能得到您经济上的支持。
我博客上面的内容均属于个人的经验,所有的内容均为开源内容,允许您用于任何非商业用途,并不以付费为前提,如果您觉得在阅读和使用我所提供的各种内容的过程中,您得到了帮助,并能在经济上给予我支持,我将感激不尽。
您可以通过点击我网站上的广告表示对我的支持。
您可以通过银行转帐付款给我:
招商银行一卡通:
卡号:6225888712586894
姓名:牟勇
您也可以通过汇款的方式:
通讯地址:云南省昆明市女子(28)中学人民中路如意巷1号
收信人:陈谦转牟勇收
邮编:650021
无论您给予我怎么样的支持,我都衷心的再次感谢。
欢迎光临我的博客,欢迎宣传我的博客
http://blog.csdn.net/mouyong
http://blog.sina.com.cn/mouyong
EMail:mouyong@yeah.net
QQ:11167603
MSN:mouyong1973@hotmail.com