功能
记录当前电脑打开的文件夹,当电脑重启或者其他原因文件夹关闭后,可以一键恢复之前打开的所有文件夹
开发原因
最近要学习一些新的知识,其中用到了很多的文件,但是这些文件分布在不同的文件夹中,由于文件数量众多想要聚合在一个文件夹中不太现实。
所以我想开发一款软件,记录当前所打开的所有文件夹,当电脑重启后,可以一键恢复之前打开的所有文件夹,而不用一个个再重新打打开,省时省力。
功能原理
- win10自带的bat功能,将需要打开的文件夹记录成如下形式,下次只需要启动bat即可
2.使用python的win32gui,扫描当前打开所有窗口,获得窗口的标题
文件夹需要设置如下:
标题就是文件夹的路径。这样,我们只需要获得窗口的标题就行了。
3 .这里是java实现的,另外一种方式。特别麻烦,不推荐。c/s模式,创建一个客户端C,放到需要记录的文件夹中回传给服务器端S文件路径,S收集路径信息生成bat文件。c端是文件夹的搜索子,我这样称呼。
python实现很简单的
代码如下:有点基础都能看,不解释
import win32gui
import time
hwnd_title = dict()
def get_all_hwnd(hwnd, mouse):
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
win32gui.EnumWindows(get_all_hwnd, 0)
temp_str=":一键记录文件状态\n"
#扫描所有窗口的标题,获得文件夹路径的并生成bat文件
for i in hwnd_title.values():
if i is not "" and i.find("\\")>0 and i[-4:len(i)]!=".exe":
temp_str=temp_str+"start \"\" \""+i+"\""+"\n"
f = open('C:/Users/Administrator.DESKTOP-KMH7HN6/Desktop/文件恢复'+(time.strftime('%d%H%M',time.localtime(time.time())))+'.bat', 'w',encoding="GBK")
f.write(temp_str)
f.close()
java实现的特别麻烦的
软件图片
FileClient.jar
FileServer.jar
将java代码封装为可执行jar文件流程
先将FileServer.java封装
选择主类,这里主类有两个,先生成FileServer的
修改要生成的类的名字,与操作对象的名字便于辨认,不修改也可以,只是文件多了会很乱
修改后
开始构建
注意看,这里提示FileServer:jar,如果不修改就是项目名字aaa:jar,不容易辨认,这里就容易辨认输出的是哪个类了
得到需要的jar文件,FileServer.jar
复制到桌面执行
另一个类FileClient类似,需要注意的是这个文件夹删除一下,因为这里记录的是FileServer的信息,在创建FileServer.jar的时候生成的。删掉它,在创建FileClient的时候它会自动生成,不然会冲突。
程序源代码
FileClient.java
import javax.swing.*;
import java.io.File;
import java.io.PrintStream;
import java.net.Socket;
public class FileClient {
public static void main(String[] args) {
try{
Socket sk =new Socket("127.0.0.1",38380);
PrintStream ps = new PrintStream(sk.getOutputStream());//将客户端套接字的输出流用printStream包装起来,类似于C语言中的fprintf类型转换
File fl=new File("");
String str = "start \"\" \""+fl.getCanonicalPath() +"\"";
System.out.println(str);
ps.println(str);//把文件地址内容送入被printstream类包装的输出流里面
ps.close();//关闭输出流包装
sk.close();//关闭socket套接字,已经传完数据,才能关闭
JOptionPane.showMessageDialog(null, "文件路径已传送", "信息", JOptionPane.INFORMATION_MESSAGE);
}
catch(Exception e){
e.printStackTrace();
}
}
}
FileServer.java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
public class FileServer extends JFrame implements ActionListener{
JPanel panel =new JPanel();
JButton b1 =new JButton("开启本地服务器");
JButton b2 =new JButton("生成bat");
JLabel lbl =new JLabel("序列示:");
JTextArea txt =new JTextArea(15,50);
//服务器线程类
public class ServerThread extends Thread {
Socket sk;
public ServerThread(Socket sk) {
this.sk = sk;
}
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String line = br.readLine();
System.out.println(line);
txt.setText(txt.getText()+line+"\r\n");
br.close();
sk.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class OpenServer extends Thread{
ServerSocket ss;//是一个能够接受其他通信实体请求的类
public void run() {
try {
ss = new ServerSocket(38380);
//用一个while循环可以同时响应多个客户端的请求
while(true){
Socket sk= ss.accept();//服务器监听对应端口的输入
ServerThread st = new ServerThread(sk);//创建一个线程,用线程创建一个套接字
st.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String GetPath(){
return System.getProperty("user.dir");
}
public void BornFile(String data) throws Exception{
SimpleDateFormat df = new SimpleDateFormat("HH时mm");//设置日期格式
String newFileName="C:\\Users\\Administrator.DESKTOP-KMH7HN6\\Desktop\\文件状态恢复"+df.format(new Date())+".bat";
FileOutputStream fos = new FileOutputStream(newFileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
osw.write(data);
osw.flush();
osw.close();
}
public FileServer(){
this.setLayout(new FlowLayout());
panel.add(b1);panel.add(b2);panel.add(lbl);panel.add(txt);
this.add(panel);
b1.addActionListener(this);
b2.addActionListener(this);
}
public static void main(String[] args) {
FileServer test=new FileServer();
test.setSize(910,300);
test.setLocationRelativeTo(null);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println(ae);
System.out.println(ae.getActionCommand() );
if(ae.getActionCommand().equals("开启本地服务器")){
OpenServer os=new OpenServer();
os.start();
b1.setEnabled(false);
}
else{
try {
BornFile(txt.getText());
System.exit(-1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}