package bs.util.tool.commongui.plugins;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import bs.util.io.PropertiesUtils;
import bs.util.tool.commongui.GuiJPanel;
import bs.util.tool.commongui.GuiUtils;
import bs.util.tool.commongui.utils.CopyFileFromCommonsIo;
import bs.util.tool.commongui.utils.FileUtils;
/**
* 文件(夹)操作.
*/
public class FolderAndFileOperate extends GuiJPanel {
private static final long serialVersionUID = 1L;
/**
* 路径表单.
*/
private JTextField pathTextField = new JTextField();
/**
* 目录选择.
*/
private JFileChooser search_fileChooser = new JFileChooser();
/**
* 查找类型-文件(夹)查找.
*/
private final String type_search = "文件(夹)查找";
/**
* 查找类型-重复文件查找.
*/
private final String type_repeatSearch = "重复文件查找";
/**
* 查找类型-同名文件查找.
*/
private final String type_sameNameSearch = "同名文件查找";
/**
* 查找类型-空文件(夹)查找.
*/
private final String type_blankSearch = "空文件(夹)查找";
/**
* 查找类型.
*/
private final String[] types = new String[] { type_search, type_repeatSearch, type_sameNameSearch, type_blankSearch };
/**
* 当前查找类型.
*/
private String curType = types[0];
/**
* 操作类型-默认查找.
*/
private final String action_onlySearch = "默认查找";
/**
* 操作类型-复制文件.
*/
private final String action_copyFile = "复制文件";
/**
* 操作类型-剪切文件.
*/
private final String action_cutFile = "剪切文件";
/**
* 操作类型-删除文件.
*/
private final String action_deleteFile = "删除文件";
/**
* 操作类型-删除空文件夹.
*/
private final String action_deleteBlankFolder = "删除空文件夹";
/**
* 操作类型.
*/
private final String[] actions = new String[] { action_onlySearch, action_copyFile, action_cutFile,
action_deleteFile, action_deleteBlankFolder };
/**
* 当前操作类型.
*/
private String curAction = actions[0];
/**
* 操作(复制、剪切文件存放位置)表单.
*/
private JTextField actionTextField = new JTextField(15);
/**
* 操作(复制、剪切文件存放位置)目录选择.
*/
private JFileChooser action_fileChooser = new JFileChooser();
/**
* 操作(复制、剪切文件存放位置)目录浏览按钮.
*/
private JButton action_chooseButton = createJButton("浏览", "", GuiUtils.font12_cn);
/**
* 常见文件类型.
*/
private Map<String, String> fileTypesMap = new HashMap<String, String>();
/**
* 常见文件类型名称.
*/
private String[] fileTypeNames;
/**
* 当前类型.
*/
private String curFileType = "";
/**
* 是否包括文件,默认为true.
*/
private boolean containsFile = true;
/**
* 是否包括文件夹,默认为true.
*/
private boolean containsFolder = true;
/**
* 是否包括隐藏文件(夹),默认为true.
*/
private boolean containsHidden = true;
/**
* 是否包括非隐藏文件(夹),默认为true.
*/
private boolean containsNotHidden = true;
/**
* 是否显示文件(夹)完整路径.
*/
private boolean viewFullPathProp = true;
/**
* 是否显示文件大小.
*/
private boolean viewSizeCkProp = true;
/**
* 显示文件大小单位,默认M.
*/
private String viewSizeCkPropUnit = "M";
/**
* 是否显示修改时间.
*/
private boolean viewModifyTimeProp = false;
/**
* 是否显示隐藏属性.
*/
private boolean viewHiddenProp = false;
/**
* 文件大小,最小表单.
*/
private JFormattedTextField fileSizeFromTextField = createNumberTextField();
/**
* 文件大小,最大表单.
*/
private JFormattedTextField fileSizeToTextField = createNumberTextField();
/**
* 文件大小单位,最小下拉框.
*/
private JComboBox fileSizeUnitFromBox = createFileSizeUnitBox(GuiUtils.font13_cn);
/**
* 文件大小单位,最大下拉框.
*/
private JComboBox fileSizeUnitToBox = createFileSizeUnitBox(GuiUtils.font13_cn);
/**
* 修改时间,开始表单.
*/
private JFormattedTextField modifyTimeFromTextField = createDateTextField();
/**
* 修改时间,结束表单.
*/
private JFormattedTextField modifyTimeToTextField = createDateTextField();
/**
* 文件(夹)路径包含字符表单.
*/
private JTextField filePathContainsTextField;
/**
* 文件(夹)路径不包含字符表单.
*/
private JTextField filePathNotContainsTextField;
/**
* 文件(夹)路径是否支持正则.
*/
private boolean filePathSupportRegex = false;
/**
* 文件名包含字符表单.
*/
private JTextField fileNameContainsTextField;
/**
* 文件名不包含字符表单.
*/
private JTextField fileNameNotContainsTextField;
/**
* 文件名是否支持正则.
*/
private boolean fileNameSupportRegex = false;
/**
* 文件夹路径包含字符表单.
*/
private JTextField folderPathContainsTextField;
/**
* 文件夹路径不包含字符表单.
*/
private JTextField folderPathNotContainsTextField;
/**
* 文件夹路径是否支持正则.
*/
private boolean folderPathSupportRegex = false;
/**
* 结果文本域.
*/
private JTextArea resultTextArea = createJTextArea(GuiUtils.font14_un);
/**
* 高级条件面板.
*/
private JPanel advanceConditionPanel;
{
// 常见文件类型
String fileTypePropsPath = "conf/FolderAndFileOperate/filetype.properties";
try {
Map<String, String> propsMap = PropertiesUtils.getPropertiesMap(GuiUtils.getActualPath(fileTypePropsPath));
List<String> propsSortAndNames = new ArrayList<String>();
for (String key : propsMap.keySet()) {
propsSortAndNames.add(key);
}
Collections.sort(propsSortAndNames); // 排序
int expSize = propsSortAndNames.size() + 1;
fileTypeNames = new String[expSize];
fileTypeNames[0] = "所有";
fileTypesMap.put(fileTypeNames[0], "");
// 常见文件类型,按序号正排序
for (int i = 1; i < expSize; i++) {
String key = propsSortAndNames.get(i - 1);
String[] keySplit = key.split("_");
fileTypeNames[i] = keySplit.length > 1 ? key.substring(keySplit[0].length() + 1) : keySplit[0];
fileTypesMap.put(fileTypeNames[i], propsMap.get(key));
}
} catch (IOException e) {
logLoadPropertiesException(fileTypePropsPath, e);
}
}
public FolderAndFileOperate() {
// 主面板:边界布局,分North、Center两部分,North用于放置条件控件,Center是放置高级(条件)及输出
setLayout(new BorderLayout());
// 输入/操作
JPanel inputPanel = new JPanel(new GridLayout(3, 1));
add(inputPanel, BorderLayout.NORTH);
// 目录选择/填写
JPanel fileChooPanel = new JPanel(new BorderLayout());
addJLabel(fileChooPanel, " 目录: ", GuiUtils.font14_cn, BorderLayout.WEST);
JPanel pathPanel = new JPanel(new BorderLayout());
pathPanel.add(new JPanel(), BorderLayout.NORTH);
addJTextField(pathPanel, pathTextField, GuiUtils.font14_un, BorderLayout.CENTER);
pathPanel.add(new JPanel(), BorderLayout.SOUTH);
fileChooPanel.add(pathPanel, BorderLayout.CENTER);
JPanel buttonFlowPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
addJButton(buttonFlowPanel, "浏览", "", GuiUtils.font12_cn,
buttonBrowseListener(search_fileChooser, pathTextField));
// Search按钮
addJButton(buttonFlowPanel, "查找", "", GuiUtils.font14b_cn, new MouseListener() {
public void mouseReleased(MouseEvent event) {
String path = pathTextField.getText().trim();
if (!new File(path).exists()) {
showMessage("查找目录不存在!", "警告", JOptionPane.WARNING_MESSAGE);
return;
}
if (curAction.equals(action_copyFile) || curAction.equals(action_cutFile)) {
String actionPath = actionTextField.getText().trim();
if (!new File(actionPath).exists()) {
showMessage("复制或剪切文件存放目录不存在!", "警告", JOptionPane.WARNING_MESSAGE);
return;
}
}
Map<String, Object> paramsMap = new HashMap<String, Object>();
if (curType.equals(type_repeatSearch)) {
paramsMap.put("type_repeatSearch", true);
FileUtils.sameSizeFilesMap = new HashMap<String, List<File>>();
FileUtils.repeatFilesMap = new HashMap<String, List<File>>();
FileUtils.repeatFilesProp = new LinkedHashSet<String>();
} else if (curType.equals(type_sameNameSearch)) {
paramsMap.put("type_sameNameSearch", true);
FileUtils.sameNameFilesMap = new HashMap<String, List<File>>();
FileUtils.sameNameFilesProp = new LinkedHashSet<String>();
} else if (curType.equals(type_blankSearch)) {
paramsMap.put("type_blankSearch", true);
}
Long curTime = new Date().getTime();
paramsMap.put("searchFileType", curFileType);
paramsMap.put("containsFile", containsFile);
paramsMap.put("containsFolder", containsFolder);
paramsMap.put("containsHidden", containsHidden);
paramsMap.put("containsNotHidden", containsNotHidden);
paramsMap.put("fileSizeFrom", GuiUtils.getCountFileSizeUnit(fileSizeFromTextField.getText().trim(),
fileSizeUnitFromBox.getSelectedItem().toString()));
paramsMap.put("fileSizeTo", GuiUtils.getCountFileSizeUnit(fileSizeToTextField.getText().trim(),
fileSizeUnitToBox.getSelectedItem().toString()));
paramsMap.put("modifyTimeFrom",
getLongFormatTime(modifyTimeFromTextField.getText().trim(), format_yyyyMMddHHmmss));
paramsMap.put("modifyTimeTo",
getLongFormatTime(modifyTimeToTextField.getText().trim(), format_yyyyMMddHHmmss));
paramsMap.put("filePathContainsText", filePathContainsTextField.getText().trim());
paramsMap.put("filePathNotContainsText", filePathNotContainsTextField.getText().trim());
paramsMap.put("filePathSupportRegex", filePathSupportRegex);
paramsMap.put("fileNameContainsText", fileNameContainsTextField.getText().trim());
paramsMap.put("fileNameNotContainsText", fileNameNotContainsTextField.getText().trim());
paramsMap.put("fileNameSupportRegex", fileNameSupportRegex);
paramsMap.put("folderPathContainsText", folderPathContainsTextField.getText().trim());
paramsMap.put("folderPathNotContainsText", folderPathNotContainsTextField.getText().trim());
paramsMap.put("folderPathSupportRegex", folderPathSupportRegex);
// 最终Search到的File,当查找类型为'重复文件查找',files最后长度为0,结果保存在FileUtils.repeatFilesProp及FileUtils.repeatFilesMap中
List<File> files = FileUtils.getAllSubFiles(path, paramsMap);
int cnt_action = 0;
if (curType.equals(type_repeatSearch)) {
List<File> repeatFiles = null;
long cnt = 0;
int groupCnt = FileUtils.repeatFilesProp.size();
int size_cnt = 0;
int f = 0;
resultTextArea
.append("查找方法:取出有相同大小的所有文件,比较文件大小以及前2048Byte的内容的MD5值是否一样,\n 如果两者相同,则认为重复,否则认为不重复,有较小的误差率。\n\n\n");
for (String prop : FileUtils.repeatFilesProp) {
resultTextArea.append("第" + (++f) + "组:\n");
repeatFiles = FileUtils.repeatFilesMap.get(prop);
cnt += repeatFiles.size();
Integer[] cntArr = printPropAndAction(curAction, repeatFiles);
cnt_action += cntArr[0];
size_cnt += cntArr[5];
}
resultTextArea.append("\n\nCount repeat group: " + groupCnt + ", files: " + cnt + ", Size: "
+ size_cnt + "M");
FileUtils.repeatFilesMap.clear();
FileUtils.repeatFilesMap = null;
FileUtils.repeatFilesProp.clear();
FileUtils.repeatFilesProp = null;
} else if (curType.equals(type_sameNameSearch)) {
List<File> sameNameFiles = null;
long cnt = 0;
int groupCnt = FileUtils.sameNameFilesProp.size();
int size_cnt = 0;
int f = 0;
resultTextArea.append("查找方法:比较文件名,不比较后缀名,查找相同文件名称的文件。\n\n\n");
for (String prop : FileUtils.sameNameFilesProp) {
resultTextArea.append("第" + (++f) + "组:\n");
sameNameFiles = FileUtils.sameNameFilesMap.get(prop);
cnt += sameNameFiles.size();
Integer[] cntArr = printPropAndAction(curAction, sameNameFiles);
cnt_action += cntArr[0];
size_cnt += cntArr[5];
}
resultTextArea.append("\n\nCount same name group: " + groupCnt + ", files: " + cnt + ", Size: "
+ size_cnt + "M");
FileUtils.sameNameFilesMap.clear();
FileUtils.sameNameFilesMap = null;
FileUtils.sameNameFilesProp.clear();
FileUtils.sameNameFilesProp = null;
} else {
Integer[] cntArr = printPropAndAction(curAction, files);
cnt_action += cntArr[0];
resultTextArea.append("\n\nCount: " + files.size() + ", Size: " + cntArr[5] + "M, folders: "
+ cntArr[1] + ", files: " + cntArr[2] + ", hidden folders: " + cntArr[3]
+ ", hidden files: " + cntArr[4]);
}
files.clear();
files = null;
if (curAction.equals(action_copyFile)) {
resultTextArea.append(", Count Copy files: " + cnt_action);
} else if (curAction.equals(action_cutFile)) {
resultTextArea.append(", Count Cut files: " + cnt_action);
} else if (curAction.equals(action_deleteFile)) {
resultTextArea.append(", Count Delete files: " + cnt_action);
} else if (curAction.equals(action_deleteBlankFolder)) {
resultTextArea.append(", Count Delete blank folders: " + cnt_action);
}
resultTextArea.append(". Cost time:" + (new Date().getTime() - curTime) / 1000.0 + "s.");
System.gc();
}
public void mousePressed(MouseEvent e) {
resultTextArea.setText("");
}
public void mouseExited(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
});
// 路径选择控件
search_fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 仅可选择文件夹
fileChooPanel.add(buttonFlowPanel, BorderLayout.EAST);
inputPanel.add(fileChooPanel);
// 条件
JPanel conditionPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
// 查找类型
addJLabel(conditionPanel, " 查找类型: ", GuiUtils.font14_cn);
addJComboBox(conditionPanel, types, GuiUtils.font13_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curType = ((JComboBox) event.getSource()).getSelectedItem().toString();
if (curType.equals(type_blankSearch)) {
fileSizeFromTextField.setText("");
fileSizeFromTextField.setEnabled(false);
fileSizeUnitFromBox.setEnabled(false);
fileSizeToTextField.setText("");
fileSizeToTextField.setEnabled(false);
fileSizeUnitToBox.setEnabled(false);
} else {
fileSizeFromTextField.setEnabled(true);
fileSizeUnitFromBox.setEnabled(true);
fileSizeToTextField.setEnabled(true);
fileSizeUnitToBox.setEnabled(true);
}
}
});
addJLabel(conditionPanel, " 文件类型: ", GuiUtils.font14_cn);
// 常见文件类型下拉框
addJComboBox(conditionPanel, fileTypeNames, GuiUtils.font13_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curFileType = fileTypesMap.get(((JComboBox) event.getSource()).getSelectedItem().toString());
}
});
addJLabel(conditionPanel, " 包括:", GuiUtils.font14_cn);
// 是否包括文件JCheckBox
addJCheckBox(conditionPanel, "文件", true, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
containsFile = checkBox.isSelected();
}
});
// 是否包括文件夹JCheckBox
addJCheckBox(conditionPanel, "文件夹", true, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
containsFolder = checkBox.isSelected();
}
});
// 是否包括隐藏文件(夹)JCheckBox
addJCheckBox(conditionPanel, "隐藏文件(夹)", true, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
containsHidden = checkBox.isSelected();
}
});
// 是否包括隐藏文件(夹)JCheckBox
addJCheckBox(conditionPanel, "非隐藏文件(夹)", true, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
containsNotHidden = checkBox.isSelected();
}
});
inputPanel.add(conditionPanel);
JPanel viewPropAndActionPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
addJLabel(viewPropAndActionPanel, " 操作类型: ", GuiUtils.font14_cn);
// 操作类型下拉框
addJComboBox(viewPropAndActionPanel, actions, GuiUtils.font13_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curAction = ((JComboBox) event.getSource()).getSelectedItem().toString();
if (!curAction.equals(action_onlySearch)) {
// 将焦点转移到下一个组件,就好像此 Component 曾是焦点所有者
((JComboBox) event.getSource()).transferFocus();
showMessage("非查找操作务必确认不会对原文件(夹)造成意外损害!", "警告", JOptionPane.WARNING_MESSAGE);
}
if (curAction.equals(action_copyFile) || curAction.equals(action_cutFile)) {
actionTextField.setEnabled(true);
action_chooseButton.setEnabled(true);
} else {
actionTextField.setText("");
actionTextField.setEnabled(false);
action_chooseButton.setEnabled(false);
}
}
});
addJTextField(viewPropAndActionPanel, actionTextField, GuiUtils.font14_un);
actionTextField.setEnabled(false);
// 路径选择控件
action_fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 仅可选择文件夹
action_chooseButton.addActionListener(buttonBrowseListener(action_fileChooser, actionTextField));
action_chooseButton.setEnabled(false);
viewPropAndActionPanel.add(action_chooseButton);
addJLabel(viewPropAndActionPanel, " 显示:", GuiUtils.font14_cn);
// 是否显示文件(夹)完整路径
addJCheckBox(viewPropAndActionPanel, "完整路径", true, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
viewFullPathProp = checkBox.isSelected();
}
});
// 是否显示文件大小JCheckBox
addJCheckBox(viewPropAndActionPanel, "大小", true, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
viewSizeCkProp = checkBox.isSelected();
}
});
JComboBox viewSizeCkPropUnitBox = createFileSizeUnitBox(GuiUtils.font12_cn);
viewSizeCkPropUnitBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
viewSizeCkPropUnit = ((JComboBox) event.getSource()).getSelectedItem().toString();
}
});
viewPropAndActionPanel.add(viewSizeCkPropUnitBox);
// 是否显示修改时间
addJCheckBox(viewPropAndActionPanel, "修改时间", false, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
viewModifyTimeProp = checkBox.isSelected();
}
});
// 是否显示文件大小JCheckBox
addJCheckBox(viewPropAndActionPanel, "隐藏属性", false, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
viewHiddenProp = checkBox.isSelected();
}
});
// 展开/收缩高级(条件)按钮
addJButton(viewPropAndActionPanel, "高级", "", GuiUtils.font12_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
advanceConditionPanel.setVisible(!advanceConditionPanel.isVisible());
getContextPanel().revalidate();
}
});
inputPanel.add(viewPropAndActionPanel);
// 高级(条件)及输出面板,使用边界布局,North为高级(条件),Center为输出
JPanel advanceAndResultPanel = new JPanel(new BorderLayout());
// 高级(条件
advanceConditionPanel = new JPanel(new GridLayout(4, 1));
advanceConditionPanel.setVisible(false);
advanceAndResultPanel.add(advanceConditionPanel, BorderLayout.NORTH);
// 大小条件、时间条件
JPanel fileSizeTimePanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
addJLabel(fileSizeTimePanel, " 文件大小: ", GuiUtils.font14_cn);
fileSizeTimePanel.add(fileSizeFromTextField);
fileSizeTimePanel.add(fileSizeUnitFromBox);
addJLabel(fileSizeTimePanel, "-", GuiUtils.font14_cn);
fileSizeTimePanel.add(fileSizeToTextField);
fileSizeTimePanel.add(fileSizeUnitToBox);
addJLabel(fileSizeTimePanel, " 修改时间: ", GuiUtils.font14_cn);
fileSizeTimePanel.add(modifyTimeFromTextField);
addJLabel(fileSizeTimePanel, "--", GuiUtils.font14_cn);
fileSizeTimePanel.add(modifyTimeToTextField);
advanceConditionPanel.add(fileSizeTimePanel);
// 文件(夹)路径包含(不包含)字符
JPanel filePathContainsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
addJLabel(filePathContainsPanel, " 文件/夹路径包含:", GuiUtils.font14_cn);
filePathContainsTextField = new JTextField(24);
addJTextField(filePathContainsPanel, filePathContainsTextField, GuiUtils.font14_un);
addJLabel(filePathContainsPanel, " 文件/夹路径不包含:", GuiUtils.font14_cn);
filePathNotContainsTextField = new JTextField(24);
addJTextField(filePathContainsPanel, filePathNotContainsTextField, GuiUtils.font14_un);
// 是否支持正则
addJCheckBox(filePathContainsPanel, "支持正则", false, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
filePathSupportRegex = ((JCheckBox) event.getSource()).isSelected();
}
});
advanceConditionPanel.add(filePathContainsPanel);
// 文件名包含(不包含)字符
JPanel fileNameContainsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
addJLabel(fileNameContainsPanel, " 文件名包含字符: ", GuiUtils.font14_cn);
fileNameContainsTextField = new JTextField(24);
addJTextField(fileNameContainsPanel, fileNameContainsTextField, GuiUtils.font14_un);
addJLabel(fileNameContainsPanel, " 文件名不包含字符: ", GuiUtils.font14_cn);
fileNameNotContainsTextField = new JTextField(24);
addJTextField(fileNameContainsPanel, fileNameNotContainsTextField, GuiUtils.font14_un);
// 是否支持正则
addJCheckBox(fileNameContainsPanel, "支持正则", false, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
fileNameSupportRegex = ((JCheckBox) event.getSource()).isSelected();
}
});
advanceConditionPanel.add(fileNameContainsPanel);
// 文件夹路径包含(不包含)字符
JPanel folderPathContainsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
addJLabel(folderPathContainsPanel, " 文件夹路径包含: ", GuiUtils.font14_cn);
folderPathContainsTextField = new JTextField(24);
addJTextField(folderPathContainsPanel, folderPathContainsTextField, GuiUtils.font14_un);
addJLabel(folderPathContainsPanel, " 文件夹路径不包含: ", GuiUtils.font14_cn);
folderPathNotContainsTextField = new JTextField(24);
addJTextField(folderPathContainsPanel, folderPathNotContainsTextField, GuiUtils.font14_un);
// 是否支持正则
addJCheckBox(folderPathContainsPanel, "支持正则", false, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
folderPathSupportRegex = ((JCheckBox) event.getSource()).isSelected();
}
});
advanceConditionPanel.add(folderPathContainsPanel);
// 输出结果
JPanel resultPanel = new JPanel(new BorderLayout());
resultPanel.add(new JScrollPane(resultTextArea));
advanceAndResultPanel.add(resultPanel, BorderLayout.CENTER);
add(advanceAndResultPanel, BorderLayout.CENTER);
}
/**
* 输出文件属性及根据操作类型操作文件,返回值表示复制文件/剪切文件/删除文件/删除文件夹的数目,查找到文件夹总数,查找到文件总数,
* 查找到隐藏文件夹总数,查找到隐藏文件总数.
*/
private Integer[] printPropAndAction(String action, List<File> files) {
int cnt_action = 0;
int cnt_folders = 0;
int cnt_files = 0;
int cnt_folders_hidden = 0;
int cnt_files_hidden = 0;
long cnt_length = 0;
for (File file : files) {
if (file.isDirectory()) {
cnt_folders++;
if (file.isHidden()) {
cnt_folders_hidden++;
}
} else {
cnt_files++;
cnt_length += file.length();
if (file.isHidden()) {
cnt_files_hidden++;
}
}
if (viewFullPathProp) {
resultTextArea.append(file.getAbsolutePath());
} else {
resultTextArea.append(file.getName());
}
if (viewSizeCkProp && !file.isDirectory()) {
resultTextArea.append(" Size: ");
if (viewSizeCkPropUnit.equals(GuiUtils.FileSize_M)) {
resultTextArea.append(format_double_3.format(file.length() / 1024.0 / 1024.0) + "M");
} else if (viewSizeCkPropUnit.equals(GuiUtils.FileSize_KB)) {
resultTextArea.append(format_double_3.format(file.length() / 1024.0) + "KB");
} else if (viewSizeCkPropUnit.equals(GuiUtils.FileSize_Byte)) {
resultTextArea.append(file.length() + "Byte");
} else if (viewSizeCkPropUnit.equals(GuiUtils.FileSize_G)) {
resultTextArea.append(format_double_6.format(file.length() / 1024.0 / 1024.0 / 1024.0) + "G");
}
}
if (viewModifyTimeProp) {
resultTextArea.append(" ModifyTime: " + format_yyyyMMddHHmmss.format(new Date(file.lastModified())));
}
if (viewHiddenProp) {
resultTextArea.append(" Hidden: " + (file.isHidden() ? "Y" : "N"));
}
resultTextArea.append("\n");
if (!curAction.equals(action_onlySearch)) {
if (!file.isDirectory()) {
if (curAction.equals(action_copyFile)) {
// 复制文件
copyFile(file);
cnt_action++;
} else if (curAction.equals(action_cutFile)) {
// 剪切文件
copyFile(file); // 先复制文件
file.delete(); // 然后删除文件
cnt_action++;
} else if (curAction.equals(action_deleteFile)) {
file.delete(); // 删除文件
cnt_action++;
}
} else if (curAction.equals(action_deleteBlankFolder) && file.listFiles() != null
&& file.listFiles().length == 0) {
file.delete(); // 删除空文件夹
cnt_action++;
}
}
}
return new Integer[] { cnt_action, cnt_folders, cnt_files, cnt_folders_hidden, cnt_files_hidden,
(int) (cnt_length / 1024 / 1024) };
}
/**
* 复制文件.
*/
private void copyFile(File srcFile) {
String actionPath = actionTextField.getText().trim();
try {
CopyFileFromCommonsIo.copyFile(srcFile, new File(actionPath + "/" + srcFile.getName()));
} catch (IOException e) {
showExceptionMessage(e);
}
}
}