1 /** 2 * 3 */ 4 package com.alon.FileMake; 5 6 import java.awt.BorderLayout; 7 import java.awt.Color; 8 import java.awt.Container; 9 import java.awt.Dimension; 10 import java.awt.FlowLayout; 11 import java.awt.Font; 12 import java.awt.GridLayout; 13 import java.awt.Toolkit; 14 import java.awt.event.ActionEvent; 15 import java.awt.event.ActionListener; 16 import java.io.BufferedInputStream; 17 import java.io.BufferedReader; 18 import java.io.File; 19 import java.io.FileInputStream; 20 import java.io.FileNotFoundException; 21 import java.io.FileOutputStream; 22 import java.io.FileReader; 23 import java.io.FileWriter; 24 import java.io.IOException; 25 import java.io.InputStream; 26 import java.io.InputStreamReader; 27 import java.io.OutputStreamWriter; 28 import java.util.ArrayList; 29 import java.util.Enumeration; 30 import java.util.HashMap; 31 import java.util.Iterator; 32 import java.util.Map; 33 import java.util.Map.Entry; 34 import java.util.Properties; 35 import java.util.function.Predicate; 36 import java.util.regex.Matcher; 37 import java.util.regex.Pattern; 38 39 import javax.management.loading.PrivateClassLoader; 40 import javax.print.DocFlavor.STRING; 41 import javax.swing.BoundedRangeModel; 42 import javax.swing.ButtonGroup; 43 import javax.swing.JButton; 44 import javax.swing.JCheckBox; 45 import javax.swing.JFileChooser; 46 import javax.swing.JFrame; 47 import javax.swing.JLabel; 48 import javax.swing.JOptionPane; 49 import javax.swing.JPanel; 50 import javax.swing.JRadioButton; 51 import javax.swing.JScrollBar; 52 import javax.swing.JScrollPane; 53 import javax.swing.JTabbedPane; 54 import javax.swing.JTextArea; 55 import javax.swing.JTextField; 56 import javax.swing.ScrollPaneConstants; 57 import javax.swing.SwingConstants; 58 import javax.swing.UIManager; 59 import javax.swing.plaf.FontUIResource; 60 import javax.swing.text.AsyncBoxView.ChildLocator; 61 62 /** 63 * @author Administrator 64 * 65 */ 66 /** 67 * @author Administrator 68 * 69 */ 70 /** 71 * @author Administrator 72 * 73 */ 74 /** 75 * @author Administrator 76 * 77 */ 78 public class FileCheackFrame extends JFrame implements ActionListener { 79 // 日志界面 80 private JTextArea logArea; 81 //日志滚动条 82 private JScrollBar textAreaScroll; 83 // 配置界面 84 private JTextArea configArea; 85 // 根路径 86 private JTextField rootPathFiled; 87 // 项目路径 88 private JTextField childPathFiled; 89 // 需求路径 90 private JTextField secondPathFiled; 91 92 // 生成按钮 93 private JButton okButton; 94 // 检查按钮 95 private JButton checkBtn; 96 97 // 存取遍历路径结果 98 private ArrayList<String> pathList; 99 100 // 存取RM配置文件 101 private HashMap<String, String> rmMap; 102 103 private final String CONFIGPATH = System.getProperty("user.dir") + File.separator + "config.properties"; 104 105 private JCheckBox checkBox1; 106 private JCheckBox checkBox2; 107 private JCheckBox checkBox3; 108 private JCheckBox checkBox4; 109 private JCheckBox checkBox5; 110 111 private JFileChooser rootPathChooser = new JFileChooser(); 112 private JFileChooser childPathChooser = new JFileChooser(); 113 private JFileChooser secondPathChooser = new JFileChooser(); 114 115 private JButton rootSelectbtn; 116 private JButton childSelectbtn; 117 private JButton secondSelectbtn; 118 119 // 迭代一单选框 120 private JRadioButton iterOneRadio; 121 // 迭代二单选框 122 private JRadioButton iterTwoRadio; 123 124 // 前后代码 125 private JCheckBox newOldCheckBox; 126 // 测试报告 127 private JCheckBox testCheckBox; 128 // 设计文档 129 private JCheckBox designCheckBox; 130 // 反讲纪要 131 private JCheckBox sumaryCheckBox; 132 // 代码评审记录 133 private JCheckBox reviewCheckBox; 134 135 // 刷新配置文件 136 private JButton refreshBtn; 137 // 保存配置文件 138 private JButton saveBtn; 139 140 public FileCheackFrame() { 141 initConfig(); 142 initUi(); 143 initDefaultValue(); 144 this.setVisible(true); 145 } 146 147 private void initConfig() { 148 System.setProperty("sun.jnu.encoding", "utf-8"); 149 // 设置界面使用字体 150 FontUIResource fontUIResource = new FontUIResource(new Font("宋体", Font.PLAIN, 12)); 151 for (Enumeration keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) { 152 Object key = keys.nextElement(); 153 Object value = UIManager.get(key); 154 if (value instanceof FontUIResource) { 155 UIManager.put(key, fontUIResource); 156 } 157 } 158 159 this.setSize(800, 900); 160 this.setTitle("FileCreateTool"); 161 this.setResizable(false); 162 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 163 164 // 设置位于屏幕中间 165 int windowWidth = this.getWidth(); // 获得窗口宽 166 int windowHeight = this.getHeight(); // 获得窗口高 167 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 获取屏幕的尺寸 168 int screenWidth = screenSize.width; // 获取屏幕的宽 169 int screenHeight = screenSize.height; // 获取屏幕的高 170 this.setLocation(screenWidth / 2 - windowWidth / 2, screenHeight / 2 - windowHeight / 2);// 设置窗口居中显示 171 } 172 173 public void initUi() { 174 JTabbedPane maintab = new JTabbedPane(); 175 Container container = new Container(); 176 177 // 初始化控件 178 JLabel rootPathLable = new JLabel("根目录"); 179 rootPathFiled = new JTextField(); 180 JLabel childPathLable = new JLabel("子目录"); 181 childPathFiled = new JTextField(); 182 JLabel secondPathLable = new JLabel("文件夹"); 183 secondPathFiled = new JTextField(); 184 JLabel chooseIterLable = new JLabel("迭代"); 185 186 // 路径选择区域 187 JPanel northPanle = new JPanel(); 188 northPanle.setLayout(null); 189 190 rootPathLable.setBounds(10, 20, 166, 25); 191 container.add(rootPathLable); 192 rootPathFiled.setBounds(80, 20, 560, 35); 193 container.add(rootPathFiled); 194 195 childPathLable.setBounds(10, 60, 166, 25); 196 container.add(childPathLable); 197 childPathFiled.setBounds(80, 60, 560, 35); 198 container.add(childPathFiled); 199 200 secondPathLable.setBounds(10, 100, 166, 25); 201 container.add(secondPathLable); 202 secondPathFiled.setBounds(80, 100, 560, 35); 203 container.add(secondPathFiled); 204 205 rootSelectbtn = new JButton("..."); 206 rootSelectbtn.setBounds(640, 25, 30, 25); 207 rootSelectbtn.addActionListener(this); 208 container.add(rootSelectbtn); 209 210 iterOneRadio = new JRadioButton("迭代一"); 211 iterOneRadio.setBounds(100, 150, 100, 25); 212 iterOneRadio.setBackground(container.getBackground()); 213 container.add(iterOneRadio); 214 iterTwoRadio = new JRadioButton("迭代二", true); 215 iterTwoRadio.setBounds(250, 150, 100, 25); 216 iterTwoRadio.setBackground(container.getBackground()); 217 container.add(iterTwoRadio); 218 219 ButtonGroup bGroup = new ButtonGroup(); 220 bGroup.add(iterOneRadio); 221 bGroup.add(iterTwoRadio); 222 223 newOldCheckBox = new JCheckBox("前后文件", true); 224 newOldCheckBox.setBounds(50, 200, 80, 25); 225 newOldCheckBox.setBackground(container.getBackground()); 226 container.add(newOldCheckBox); 227 228 testCheckBox = new JCheckBox("测试报告", true); 229 testCheckBox.setBounds(140, 200, 80, 25); 230 testCheckBox.setBackground(container.getBackground()); 231 container.add(testCheckBox); 232 233 designCheckBox = new JCheckBox("设计文档", true); 234 designCheckBox.setBackground(container.getBackground()); 235 designCheckBox.setBounds(230, 200, 80, 25); 236 container.add(designCheckBox); 237 238 sumaryCheckBox = new JCheckBox("反讲纪要", true); 239 sumaryCheckBox.setBackground(container.getBackground()); 240 sumaryCheckBox.setBounds(320, 200, 80, 25); 241 container.add(sumaryCheckBox); 242 243 reviewCheckBox = new JCheckBox("代码评审", true); 244 reviewCheckBox.setBackground(container.getBackground()); 245 reviewCheckBox.setBounds(410, 200, 80, 25); 246 container.add(reviewCheckBox); 247 248 okButton = new JButton("创建"); 249 okButton.setBounds(600, 195, 60, 30); 250 okButton.addActionListener(this); 251 container.add(okButton); 252 253 checkBtn = new JButton("检查"); 254 checkBtn.setBounds(680, 195, 60, 30); 255 checkBtn.addActionListener(this); 256 container.add(checkBtn); 257 258 logArea = new JTextArea("Program Start...\n"); 259 logArea.setForeground(Color.white); 260 logArea.setBackground(Color.BLACK); 261 // logArea.setBounds(0, 300, 800, 600); 262 //启动自动换行 263 logArea.setLineWrap(true); 264 //换行不断字 265 logArea.setWrapStyleWord(true); 266 // logArea.setBounds(0, 300, 770, 600); 267 268 JScrollPane js = new JScrollPane(logArea); 269 js.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 270 JScrollBar jb = js.getVerticalScrollBar(); 271 jb.setSize(100,100); 272 js.setBounds(0, 300, 800, 600); 273 container.add(js); 274 275 // textAreaScroll = new JScrollBar(JScrollBar.VERTICAL, 10, 10, 0, 100); 276 // textAreaScroll.setBounds(770,300,30,600); 277 // container.add(textAreaScroll); 278 279 maintab.add("主界面", container); 280 281 Container configContainer = new Container(); 282 refreshBtn = new JButton("刷新"); 283 refreshBtn.addActionListener(this); 284 refreshBtn.setBounds(250, 10, 100, 30); 285 configContainer.add(refreshBtn); 286 287 saveBtn = new JButton("保存"); 288 saveBtn.addActionListener(this); 289 saveBtn.setBounds(400, 10, 100, 30); 290 configContainer.add(saveBtn); 291 292 configArea = new JTextArea(); 293 //自动换行 294 configArea.setLineWrap(false); 295 //换行不断字 296 configArea.setWrapStyleWord(true); 297 configArea.setBackground(Color.WHITE); 298 299 JScrollPane configScroll=new JScrollPane(configArea); 300 configScroll.setBounds(0, 100, 800, 750); 301 302 configContainer.add(configScroll); 303 304 maintab.add("配置界面", configContainer); 305 306 // 配置界面 307 308 this.setContentPane(maintab); 309 } 310 311 public void actionPerformed(ActionEvent e) { 312 if (e.getSource() == rootSelectbtn) { 313 rootPathChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 314 int intRetVal = rootPathChooser.showOpenDialog(this); 315 if (intRetVal == JFileChooser.APPROVE_OPTION) { 316 rootPathFiled.setText(rootPathChooser.getSelectedFile().getPath()); 317 } 318 } 319 320 if (e.getSource() == childSelectbtn) { 321 childPathChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 322 int intRetVal = childPathChooser.showOpenDialog(this); 323 if (intRetVal == JFileChooser.APPROVE_OPTION) { 324 childPathFiled.setText(childPathChooser.getSelectedFile().getPath()); 325 } 326 } 327 328 if (e.getSource() == secondSelectbtn) { 329 secondPathChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 330 int intRetVal = secondPathChooser.showOpenDialog(this); 331 if (intRetVal == JFileChooser.APPROVE_OPTION) { 332 secondPathFiled.setText(secondPathChooser.getSelectedFile().getPath()); 333 } 334 } 335 336 if (e.getSource() == okButton) { 337 if (makeDir()) { 338 wirteConifg("childPath", childPathFiled.getText()); 339 wirteConifg("secondPath", secondPathFiled.getText()); 340 try { 341 java.awt.Desktop.getDesktop().open(new File(rootPathFiled.getText())); 342 } catch (IOException e1) { 343 // TODO Auto-generated catch block 344 } 345 } else { 346 JOptionPane.showMessageDialog(null, "创建文件夹失败", "Error", JOptionPane.ERROR_MESSAGE); 347 } 348 } 349 350 if (e.getSource() == checkBtn) { 351 HashMap<String, String> map = getConfigMap(); 352 String seq = File.separator; 353 ArrayList<String> inDirRmList; 354 HashMap<String, String> pathMap = new HashMap<String, String>(); 355 356 String rootPath = rootPathFiled.getText(); 357 // 前后代码 358 pathMap.put("newOld", rootPath + seq + map.get("newOld")); 359 // 测试报告 360 pathMap.put("test", rootPath + map.get("test")); 361 // 设计文档 362 pathMap.put("design", rootPath + map.get("design")); 363 // 反讲纪要 364 pathMap.put("sumary", rootPath + map.get("sumary")); 365 // 代码评审记录 366 pathMap.put("review", rootPath + map.get("review")); 367 368 logArea.setText("开始检查...\n"); 369 // pathList=new ArrayList<String>(); 370 // getAllFileInDir(newOld); 371 // for(String str:pathList){ 372 // logArea.append(str+"\n"); 373 // } 374 getRMConfig(); 375 for (Entry<String, String> entry : pathMap.entrySet()) { 376 switch (entry.getKey()) { 377 case "newOld": 378 logArea.append("前后文件\n"); 379 break; 380 case "test": 381 logArea.append("测试报告\n"); 382 break; 383 case "design": 384 logArea.append("设计文档\n"); 385 break; 386 case "sumary": 387 logArea.append("反讲纪要\n"); 388 break; 389 case "review": 390 logArea.append("代码检视\n"); 391 break; 392 default: 393 break; 394 } 395 inDirRmList = getRmInPath(entry.getValue()); 396 for (Entry<String, String> rmEntry : rmMap.entrySet()) { 397 if (!inDirRmList.contains(rmEntry.getKey())) { 398 logArea.append(rmEntry.getKey() + ": " + rmEntry.getValue() + "\n"); 399 } 400 } 401 } 402 } 403 404 if (e.getSource() == refreshBtn) { 405 configArea.setText(getConfigStr()); 406 logArea.append("刷新配置文件成功\n"); 407 } 408 409 if (e.getSource() == saveBtn) { 410 wirteConifg(); 411 JOptionPane.showMessageDialog(null, "写入配置成功", "Info", JOptionPane.INFORMATION_MESSAGE); 412 logArea.append("写入配置文件成功"); 413 } 414 415 if (e.getSource() == rootSelectbtn) { 416 boolean isOk = wirteConifg("rootPath", rootPathChooser.getSelectedFile().getAbsolutePath()); 417 if (!isOk) { 418 logArea.append("路径保存失败"); 419 } 420 } 421 422 if (e.getSource() == textAreaScroll) { 423 // this.logArea.set 424 } 425 426 } 427 428 private ArrayList<String> getRmInPath(String path) { 429 ArrayList<String> result = new ArrayList<String>(); 430 this.pathList = new ArrayList<String>(); 431 String regEx = "RM\\d{3}_\\d{3}"; 432 getAllFileInDir(path); 433 for (String str : this.pathList) { 434 Matcher matcher = Pattern.compile(regEx).matcher(str); 435 if (matcher.find()) { 436 result.add(matcher.group()); 437 } 438 } 439 return result; 440 441 } 442 443 private void initDefaultValue() { 444 // 设置初始路径 445 HashMap<String, String> map = getConfigMap(); 446 rootPathFiled.setText(map.get("rootPath")); 447 childPathFiled.setText(map.get("childPath")); 448 secondPathFiled.setText(map.get("secondPath")); 449 450 // 设置初始配置文件 451 String configStr = getConfigStr(); 452 configArea.setText(configStr); 453 } 454 455 private HashMap<String, String> getConfigMap() { 456 HashMap<String, String> map = new HashMap<String, String>(); 457 Properties prop = new Properties();// 属性集合对象 458 FileInputStream in; 459 try { 460 in = new FileInputStream(CONFIGPATH); 461 InputStreamReader reader = new InputStreamReader(in, "utf-8"); 462 prop.load(reader);// 将属性文件流装载到Properties对象中 463 in.close();// 关闭流 464 } catch (FileNotFoundException e) { 465 // TODO Auto-generated catch block 466 e.printStackTrace(); 467 return map; 468 } catch (IOException e) { 469 // TODO Auto-generated catch block 470 e.printStackTrace(); 471 return map; 472 } 473 Iterator<String> it = prop.stringPropertyNames().iterator(); 474 while (it.hasNext()) { 475 String key = it.next(); 476 map.put(key, prop.getProperty(key)); 477 } 478 return map; 479 } 480 481 private boolean makeDir() { 482 483 HashMap<String, String> map = getConfigMap(); 484 String rootPath = rootPathFiled.getText(); 485 String childPath = childPathFiled.getText(); 486 String secondPath = secondPathFiled.getText(); 487 488 // 前后代码 489 String newOld = map.get("newOld"); 490 // 测试报告 491 String test = map.get("test"); 492 // 设计文档 493 String design = map.get("design"); 494 // 反讲纪要 495 String sumary = map.get("sumary"); 496 // 代码评审记录 497 String review = map.get("review"); 498 // 迭代 499 String iter = iterOneRadio.isSelected() ? "迭代一" : "迭代二"; 500 501 String seq = File.separator; 502 ArrayList<String> filePath = new ArrayList<String>(); 503 if (newOldCheckBox.isSelected()) { 504 String path = rootPath + seq + newOld + seq + iter + seq + childPath + seq + secondPath; 505 filePath.add(path); 506 } 507 if (testCheckBox.isSelected()) { 508 String path = rootPath + seq + test + seq + iter + seq + childPath + seq + secondPath; 509 filePath.add(path); 510 } 511 if (designCheckBox.isSelected()) { 512 String path = rootPath + seq + design + seq + iter + seq + childPath + seq + secondPath; 513 filePath.add(path); 514 } 515 if (sumaryCheckBox.isSelected()) { 516 String path = rootPath + seq + sumary + seq + iter + seq + childPath + seq + secondPath; 517 filePath.add(path); 518 } 519 if (reviewCheckBox.isSelected()) { 520 String path = rootPath + seq + review + seq + iter + seq + childPath + seq + secondPath; 521 filePath.add(path); 522 } 523 int i = 0; 524 logArea.setText("开始创建文件夹...\n"); 525 for (String path : filePath) { 526 File file = new File(path); 527 try { 528 i++; 529 file.mkdirs(); 530 logArea.append(i + ". " + path + "\n"); 531 } catch (Exception e) { 532 return false; 533 } 534 535 } 536 return true; 537 } 538 539 // 递归遍历获取路径下的所有文件 540 private void getAllFileInDir(String path) { 541 File dir = new File(path); 542 if (!dir.exists()) { 543 return; 544 } 545 File[] files = dir.listFiles(); 546 if (files.length == 0) { 547 return; 548 } 549 for (File file : files) { 550 if (file.isDirectory()) { 551 getAllFileInDir(file.getAbsolutePath()); 552 } else { 553 pathList.add(file.getAbsolutePath()); 554 } 555 } 556 } 557 558 /** 559 * 从配置文件读取内容,返回字符串 560 * 561 * @return 562 */ 563 private String getConfigStr() { 564 BufferedReader br = null; 565 StringBuilder sb = new StringBuilder(); 566 File configFile = new File(CONFIGPATH); 567 568 try { 569 br = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), "utf-8")); 570 String line; 571 while ((line = br.readLine()) != null) { 572 sb.append(line); 573 sb.append("\n"); 574 } 575 br.close(); 576 577 } catch (Exception e) { 578 // TODO Auto-generated catch block 579 logArea.append(e.toString()); 580 } 581 582 return sb.toString(); 583 } 584 585 private void wirteConifg() { 586 try { 587 FileWriter fileWriter = new FileWriter(CONFIGPATH); 588 String content = configArea.getText(); 589 fileWriter.write(content); 590 fileWriter.close(); 591 } catch (Exception e) { 592 // TODO Auto-generated catch block 593 logArea.append(e.toString()); 594 } 595 } 596 597 private Boolean wirteConifg(String key, String value) { 598 599 Properties prop = new Properties();// 属性集合对象 600 FileInputStream fis; 601 try { 602 fis = new FileInputStream(CONFIGPATH); 603 InputStreamReader reader = new InputStreamReader(fis, "utf-8"); 604 prop.load(reader);// 将属性文件流装载到Properties对象中 605 fis.close();// 关闭流 606 } catch (FileNotFoundException e) { 607 // TODO Auto-generated catch block 608 e.printStackTrace(); 609 return false; 610 } catch (IOException e) { 611 // TODO Auto-generated catch block 612 e.printStackTrace(); 613 return false; 614 } 615 prop.setProperty(key, value); 616 // 文件输出流 617 try { 618 FileOutputStream fos = new FileOutputStream(CONFIGPATH); 619 // 将Properties集合保存到流中 620 prop.store(new OutputStreamWriter(fos, "utf-8"), "Copyright (c) Alon Studio"); 621 fos.close();// 关闭流 622 } catch (FileNotFoundException e) { 623 // TODO Auto-generated catch block 624 e.printStackTrace(); 625 return false; 626 } catch (IOException e) { 627 // TODO Auto-generated catch block 628 e.printStackTrace(); 629 return false; 630 } 631 return true; 632 } 633 634 private void getRMConfig() { 635 rmMap = new HashMap<String, String>(); 636 Properties prop = new Properties(); 637 try { 638 // 读取属性文件a.properties 639 InputStream in = new BufferedInputStream(new FileInputStream(CONFIGPATH)); 640 prop.load(new InputStreamReader(in, "utf-8")); /// 加载属性列表 641 Iterator<String> it = prop.stringPropertyNames().iterator(); 642 while (it.hasNext()) { 643 String key = it.next(); 644 if (key.startsWith("RM")) { 645 rmMap.put(key, prop.getProperty(key)); 646 } 647 } 648 in.close(); 649 } catch (Exception e) { 650 System.out.println(e); 651 } 652 } 653 654 /** 655 * @param args 656 */ 657 public static void main(String[] args) { 658 // TODO Auto-generated method stub 659 new FileCheackFrame(); 660 } 661 662 }