python记录打开的文件夹,电脑重启后一键恢复

功能

记录当前电脑打开的文件夹,当电脑重启或者其他原因文件夹关闭后,可以一键恢复之前打开的所有文件夹

开发原因

最近要学习一些新的知识,其中用到了很多的文件,但是这些文件分布在不同的文件夹中,由于文件数量众多想要聚合在一个文件夹中不太现实。
所以我想开发一款软件,记录当前所打开的所有文件夹,当电脑重启后,可以一键恢复之前打开的所有文件夹,而不用一个个再重新打打开,省时省力。

功能原理

  1. 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();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值