我现在做web开发,老大给我一个任务,之前我们有两台服务器(240,253),两台服务器有同样的一个项目,因为之前项目的修改都update到了 240,而253的没有更新,从而两个服务器中的项目不一致,现在老大说要从这两台服务器把不一样的文件路径(文件名)给找出来,之前我
Editplus自带的比对工具,一个一个文件的比对,工作率非常大。项目很大,文件又很多,这样子非把我给逼死了,搞得两眼红肿。然后自己写个程序,只要输入目录名,就把所有的目录中的文件进行比配。从中可以解决问题,但是中实现的方式来看,我觉得还是存在很多的不足。先look代码吧!
package comparefolders;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import javax.swing.*;
/**
* 文件比对,找出不比配的文件或者不存在的文件。
* @author admin
*/
public class FileDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new FileThanTest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class FileThanTest extends JFrame {
//窗口WIDTH
private static final int WIDTH = 800;
//窗口height
private static final int HEIGHT = 800;
//最新项目目录路径
private static JTextField pathTF1 = new JTextField(20);
//旧项目目录路径
private static JTextField pathTF2 = new JTextField(20);
//存储最新的项目文件所有文件路径
private static java.util.List<String> paths = null;
//比配信息,输出不比配的行
private static JTextArea textArea = new JTextArea(30, 70);
//输出不比配的文件路径
private static JTextArea textArea2 = new JTextArea(8, 70);
private static JLabel newObjectPath = new JLabel("最新版本:");
private static JLabel oldObjectPath = new JLabel("旧版本:");
//比配按钮
JButton searchFile2 = new JButton("比对");
//配置文件文件后缀名
private static final String suffixNames[] = {".jsp",".html",".css",".java",".js",".jpg"};
//
JComboBox cmbSuffixName = new JComboBox(suffixNames);
public FileThanTest() {
setTitle("king SoftWare");
setSize(WIDTH, HEIGHT);
setResizable(false);
paths = new ArrayList<String>();
JPanel panel = new JPanel();
JButton searchFile1 = new JButton("Search1");
//设置cmbSuffixName文件后缀名可编辑
cmbSuffixName.setEditable(true);
searchFile1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 文件路径
// pathTF1.setText(showDiaLog());
}
});
//比配按钮事件
searchFile2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//最新项目目录文件路径不能为空
if (pathTF1.getText().length() == 0)return;
//旧项目目录文件路径不能为空
if (pathTF2.getText().length() == 0)return;
final String path1 = pathTF1.getText();
final String path2 = pathTF2.getText();
textArea.setText("");
textArea2.setText("");
// 如果paths存储的路径不等于null,清除之前在内存的路径
if (paths != null)paths.clear();
//判断路径是否存在
File f = new File(path1);
if(!f.exists()){textArea.setText("文件目录:" + path1 + "不存在!");return;}
f = new File(path2);
if(!f.exists()){textArea.setText("文件目录:" + path1 + "不存在!");return;}
//操作中比配按钮不可用
searchFile2.setEnabled(false);
// 读取最新文件路径到内存中
getAllFile(pathTF1.getText());
//如果不存在指定的文件就return
if(paths.size() == 0) {
textArea.setText("找不到"+ cmbSuffixName.getSelectedItem() +"文件!");
searchFile2.setEnabled(true);
return;
}
if (paths.size() != 0) {
new Thread() {
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < paths.size(); i++) {
String pathString = paths.get(i);
String patString2 = pathString.substring(path1.length());
//调用比配方法
contrast(pathString, path2 + patString2);
//比配完所有文件按钮比配可用
if(i == paths.size()-1)searchFile2.setEnabled(true);
}
}
}.start();
}
}
});
panel.add(newObjectPath);
panel.add(pathTF1);
// panel.add(searchFile1);
panel.add(oldObjectPath);
panel.add(pathTF2);
panel.add(cmbSuffixName);
panel.add(searchFile2);
panel.add(new JScrollPane(textArea));
panel.add(new JScrollPane(textArea2));
add(panel);
}
/**
* 创建文件对话框
* @return
*/
public String showDiaLog() {
FileDialog dialog = new FileDialog(FileThanTest.this);
// 设置此文件对话框的目录默认值
dialog.setDirectory(".");
dialog.setVisible(true);
// 获取此文件对话框的目录。
String str = dialog.getDirectory();
// 获取此文件对话框的选定文件
String fileName = dialog.getFile();
if (str == null || fileName == null)
return null;
return str + fileName;
}
/**
* 根据传入两个文件路径进行比配
* 此方法对两个File进行对比
* @param f1
* @param f2
*/
public void contrast(String f1, String f2) {
FileReader reader1 = null;
FileReader reader2 = null;
try {
reader1 = new FileReader(f1);
reader2 = new FileReader(f2);
} catch (Exception e) {
textArea2.append(f2 + " not exists!\n");
System.err.println(f2 + " not exists!");
return;
}
// 创建inOne1一个文件缓冲器
BufferedReader inOne1 = new BufferedReader(reader1);
// 创建inTow2一个文件缓冲器
BufferedReader inTow2 = new BufferedReader(reader2);
String s1 = null;
String s2 = null;
// 行数
int line = 0;
// 是否存在不同比对
boolean b = false;
try {
while ((s1 = inOne1.readLine()) != null) {
line++;
s2 = inTow2.readLine();
if (!(s1.equals(s2))) {
b = true;
textArea.append("第 " + line + " 行" + s1 + " 和 " + s2
+ "\n");
}
}
} catch (Exception e) {
// TODO: handle exception
textArea.append("read file error!\n");
}
if (b == true) {
textArea.append("================================================================================");
textArea2.append(f1 + " 和 " + f2 + "存在不一样的文件!\n");
System.err.println(f1 + " 和 " + f2 + "存在不一样的文件!\n");
}
}
/**
* 从最新的项目获取给指定后缀的所有文件。
* 把这些文件放入内存中。
* @param fileName
*/
public void getAllFile(String fileName) {
// TODO Auto-generated method stub
File file = new File(fileName);
String suffiName = cmbSuffixName.getSelectedItem().toString();
//如果时目录文件
if(file.isDirectory()){
File[] files = file.listFiles();
if (files == null) {
textArea.setText("file not exists error!");
return;
}
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
getAllFile(files[i].getAbsolutePath());
}else{
//判断是否时指定的后缀的文件
if (files[i].getName().endsWith(suffiName)) {
paths.add(files[i].getAbsolutePath());
}
}
}
}else{
// 判断是否时指定的后缀的文件
if (file.getName().endsWith(suffiName)) {
paths.add(file.getAbsolutePath());
}
}
}
}
首先诚心的说声“非常抱歉”由于我也算是没多少经验的编程人员,可能我写的代码很难读懂,进来了,要留下些东西哦!我很希望各位能给我一些提议。
下面是我实现这个程序的思路:
1.获取最新项目的目录路径。
2.调用getAllFile(String)把“最新”项目目录下的所有文件读取到内存中。
3.在调用contrast(String,String)进行文件比对,第一个参数是“最新”项目文件路径从内存中读取,因为都是同一个项目,第二个参数“旧”项目文件路径和第一个参数路径相同。
4.读取两个文件,一行一行的比对。
如果文件数量多的话是不是存在一些bug?
希望各位朋友能给我提一些问题。