分享一个把文件夹加密的方法(aardio)

By o3o_o3o_o3o at 2021-08-08 • 0人收藏 • 409人看过

先把文件的压缩包放在这里:

加密文件夹.rar

在介绍这个加密方法之前,我先要说一些关于它的事情:


很久以前,我发现了一个奇妙的事情:

我打开了aardio中的DLL查看工具,再把我桌面上的World拖了进去。

发现了一个神奇的目录:

3.PNG

正当我寻找它的时候,发现即使打开了“查看隐藏的文件和文件夹”却怎么也找不到它:

4.PNG

但我在上方的导航栏中接着输入\Installer时,神奇的一幕发生了:

5.PNG

系统竟然把Installer自动“隐藏”了,而且很难找到!我开始研究这种文件夹隐藏的方法。

直到昨天,我在网上偶然发现了一段加密文件夹的代码,隐藏后的文件夹与Installer的效果基本相同,而且还加上了加密的功能:

6.PNG

把这段代码写进一个.bat文件里并且把需要加密的文件夹与这个文件放进同一个目录里面在运行一下这个.bat文件,在控制台里输入Y就可以隐藏并加密。我们知道.bat文件里的代码是系统命令行,所以我们就可以把此代码中的核心部分代入进aardio中的execute函数里面来执行,再稍稍改造一下,就可以成为在aardio里实施文件夹隐藏并加密了!

但是不可以直接代入:

execute("ren mayu "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"")

因为这段代码中有双引号。怎么办呢?很简单,只需要:

execute('ren mayu "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')

但是这样还不行,因为一个execute函数不能同时执行多个系统命令行。改一小下:

execute('ren mayu "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
execute('attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')

这就可以了。另一个核心部分也是这样。

这个程序还需要实现隐藏任意文件夹的功能,所以在窗口设计器上加上两个文本框:

1628432997796828.png上面的文本框的名称是Dir,

--------------------------------------

下面的文本框的名称是Password。

当你要加密的时候,这个程序就会执行这两行系统命令行,然后把此文件夹所对应的密码存放在隐藏文件夹里。

execute('ren '+mainForm.Dir.text+' "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
execute('attrib +h +s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
string.save("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text )
win.msgboxTimeout("加密成功","提示",2000)

当你要解锁的时候,这个程序就会执行另外两行系统命令行,然后把此文件夹所对应的密码的文件删除。

execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
execute('ren "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+mainForm.Dir.text+'')
fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")

但是如果解锁代码写成这样的话,就会出现一个问题,就是解锁之后的文件夹依然保留着后缀:“.{21EC2020-3AEA-1069-A2DD-08002B30309D}”,就是上面的代码段中的第二行代码出现了问题。是因为窗口在显示的时候,这个文件夹是被占用的,所以这个文件夹它不能删除、移动或是重命名,所以需要把窗口关闭,才能让文件夹重命名。于是,解锁的代码就变成了这样:

execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
process("cmd")
fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")
a = mainForm.Dir.text
mainForm.close()
win.delay(100)
key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'')
win.delay(100)//让电脑反应一下,做了一个延迟。
key.press(0xD/*_VK_ENTER*/)

可是这个mainForm的窗口要恢复,并且要让cmd的窗口关闭呀,但是process.kill("cmd")不会受到延时的影响,无论是延时多长时间,都会在key.press(0xD/*_VK_ENTER*/)的指令救赎的一瞬间执行。电脑反应不过来,会在mainFrom窗口未关闭前或在最后用虚拟键盘输入的系统命令行未执行的情况下关闭cmd的窗口,又导致解锁之后的文件夹依然保留着后缀:“.{21EC2020-3AEA-1069-A2DD-08002B30309D}”,所以我们又把代码稍微的“优化”了一下:

execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
process("cmd")
fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")
a = mainForm.Dir.text
mainForm.close()
for(i=1;75;1){
    win.delay(100)
    key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'')
    win.delay(100)
    key.press(0xD/*_VK_ENTER*/)
}
process.kill("cmd")
process("/加密文件夹.exe")
win.msgboxTimeout("解密成功","提示",2000)

使命令在文件夹从被占用的状态到可以编辑的情况下重复多次之后把cmd的窗口给关掉,使文件夹恢复原来的名字(循环75次刚刚好可以在文件夹可以在被编辑的情况下成功执行1次,并且也没有用到15秒,只是一瞬间的事),并且重新打开mainForm窗口。


最后再把代码“稍微”整改一下,“新鲜”的成品就“出炉”了!

import win.ui;
/*DSG{{*/
mainForm = win.form(text="加密";right=244;bottom=169;border="thin";max=false)
mainForm.add(
BtnChange={cls="button";text="你想要解锁吗?";left=10;top=130;right=110;bottom=160;z=5};
BtnOK={cls="button";text="OK";left=145;top=130;right=235;bottom=160;z=6};
Dir={cls="edit";left=135;top=10;right=235;bottom=30;edge=1;z=2};
Password={cls="edit";left=135;top=40;right=235;bottom=60;edge=1;password=1;z=4};
static={cls="static";text="注意:要加密或者解锁的文件夹必须要与此文件放置于同一个目录中!要加密或者解锁的文件夹的名字里面不允许出现空格!";left=10;top=63;right=235;bottom=128;transparent=1;z=7};
staticDir={cls="static";text="你想要加密的文件夹:";left=-82;top=10;right=135;bottom=30;align="right";transparent=1;z=1};
staticPassword={cls="static";text="密码:";left=15;top=40;right=135;bottom=60;align="right";transparent=1;z=3}
)
/*}}*/

mainForm.BtnChange.oncommand = function(id,event){
    if(mainForm.BtnChange.text == "你想要加密吗?"){
        mainForm.BtnChange.text = "你想要解锁吗?"
        mainForm.staticDir.text = "你想要加密的文件夹:"
        mainForm.text = "加密"
    }
    elseif(mainForm.BtnChange.text == "你想要解锁吗?"){
        mainForm.BtnChange.text = "你想要加密吗?"
        mainForm.staticDir.text = "你想要解锁的文件夹:"
        mainForm.text = "解锁"
    }
}

import fsys.file;
import fsys.dirWatcher;
import fsys;
import process;
import key;

mainForm.wndproc = function(hwnd,message,wParam,lParam){ 
    if((mainForm.Dir.text=="")||(mainForm.Password.text=="")){
        mainForm.BtnOK.disabled = true
    }
    else{
        mainForm.BtnOK.disabled = false
    }
}

mainForm.BtnOK.oncommand = function(id,event){
    if(mainForm.BtnChange.text == "你想要解锁吗?"){
        try{
            fsys.dirWatcher("/"+mainForm.Dir.text)//查看输入的目录是否存在
            execute('ren '+mainForm.Dir.text+' "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
            execute('attrib +h +s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
            string.save("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text )
            win.msgboxTimeout("加密成功","提示",2000)
        }
        catch(e){
            win.msgboxErr("文件夹名称错误!请重新输入。")
        }
    }
    elseif(mainForm.BtnChange.text == "你想要加密吗?"){
        try{
            password = fsys.file("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config").readAll()//查看输入的目录是否存在
            if(mainForm.Password.text == password){
                execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
                process("cmd")
                fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")
                a = mainForm.Dir.text
            }
            else{
                win.msgboxErr("密码错误!请重新输入。")
            }
        }
        catch(e){
            win.msgboxErr("文件夹名称错误!请重新输入。")
        }
        mainForm.close()
        win.delay(100)
        key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'')
        win.delay(100)
        key.press(0xD/*_VK_ENTER*/)
        for(i=1;75;1){
            win.delay(100)
            key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'')
            win.delay(100)
            key.press(0xD/*_VK_ENTER*/)
        }
        process.kill("cmd")
        process("/加密文件夹.exe")
        win.msgboxTimeout("解密成功","提示",2000)
    }
}

mainForm.show();
return win.loopMessage();

效果:

8 个回复 | 最后更新于 30 天前
2021-08-08   #1

这是新人第一次发布帖子。我认为我自己做的这个成品还是不太满意,尤其是解锁,代码太长,效果不太好。各位大佬们可以对我提一提修改的意见。

2021-08-08   #2

这都能发现,很有钻研精神,感谢分享。

明天用一用看看,哈

2021-08-09   #3

昨天发帖的时候忘提示一下了,名字中带有中文字符或者空格的文件夹加密会失效


2021-08-13   #4

很好的经验分享,用下面的方法文件名可以有中文和空格

命令行可以直接用 process.popen.cmd ,没有黑窗口,执行完自动关闭,用 waitOne() 就可以解决执行等待问题。

加密

process.popen.cmd('ren "'+dirName+'" "'+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne();
process.popen.cmd('attrib +h +s "'+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne();
string.save("/"+dirName+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text );

解密

process.popen.cmd('attrib -h -s "'+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne();
fsys.delete("/"+dirName+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config");
process.popen.cmd('ren "'+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" "'+dirName+'"').waitOne();

用 process.batch 执行批处理也可以;

或者用 aardio 标准库的函数也行:

加密

fsys.rename("/"+dirName, "/"+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}');
string.save("/"+dirName+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text );
fsys.attrib("/"+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}',,2/*_FILE_ATTRIBUTE_HIDDEN*/|4/*_FILE_ATTRIBUTE_SYSTEM*/);

解密

fsys.delete("/"+dirName+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config");
fsys.rename("/"+dirName+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}',"/"+dirName);
fsys.attrib("/"+dirName,2/*_FILE_ATTRIBUTE_HIDDEN*/|4/*_FILE_ATTRIBUTE_SYSTEM*/);


另外判断文件或目录是否存在可以用 io.exist("/"+dirName),fsys.dirWatcher 是目录监视器。
凡是与文件操作有关的都在 fsys 与 io 名字空间下,查看这 2 个库的函数文档即可。


2021-08-13   #5

读文件到字符串可以用 string.load() 函数:

var password = string.load("/"+dirName +".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")
2021-08-14   #6

感谢Jacen大神的建议,我根据建议又把代码优化了一下,现在它可以加密任何的文件夹,并且不需要用try catch语句了。

代码:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="加密";right=244;bottom=139;border="thin";max=false)
mainForm.add(
BtnChange={cls="button";text="你想要解锁吗?";left=10;top=100;right=110;bottom=130;z=5};
BtnOK={cls="button";text="OK";left=145;top=100;right=235;bottom=130;z=6};
Dir={cls="edit";left=135;top=10;right=235;bottom=30;edge=1;z=2};
Password={cls="edit";left=135;top=40;right=235;bottom=60;edge=1;password=1;z=4};
static={cls="static";text="注意:要加密或者解锁的文件夹必须要与此文件放置于同一个目录中!";left=10;top=63;right=235;bottom=106;transparent=1;z=7};
staticDir={cls="static";text="你想要加密的文件夹:";left=-82;top=10;right=135;bottom=30;align="right";transparent=1;z=1};
staticPassword={cls="static";text="密码:";left=15;top=40;right=135;bottom=60;align="right";transparent=1;z=3}
)
/*}}*/
mainForm.BtnChange.oncommand = function(id,event){
	if(mainForm.BtnChange.text == "你想要加密吗?"){
		mainForm.BtnChange.text = "你想要解锁吗?"
		mainForm.staticDir.text = "你想要加密的文件夹:"
		mainForm.text = "加密"
	}
	elseif(mainForm.BtnChange.text == "你想要解锁吗?"){
		mainForm.BtnChange.text = "你想要加密吗?"
		mainForm.staticDir.text = "你想要解锁的文件夹:"
		mainForm.text = "解锁"
	}
}
import fsys;
import process.popen;
mainForm.wndproc = function(hwnd,message,wParam,lParam){ 
	if((mainForm.Dir.text=="")||(mainForm.Password.text=="")){
		mainForm.BtnOK.disabled = true
	}
	else{
		mainForm.BtnOK.disabled = false
	}
}
mainForm.BtnOK.oncommand = function(id,event){
	if(mainForm.BtnChange.text == "你想要解锁吗?"){
		var isDir = io.exist("/"+ mainForm.Dir.text);
		if(isDir){
			process.popen.cmd('ren "'+mainForm.Dir.text+'" "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne();
			process.popen.cmd('attrib +h +s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne();
			string.save("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text );
			win.msgboxTimeout("加密成功","提示",2000)
		}
		else{
			win.msgboxErr("文件夹名称错误!请重新输入。")
		}
	}
	elseif(mainForm.BtnChange.text == "你想要加密吗?"){
		var isDir = io.exist("/"+ mainForm.Dir.text +".{21EC2020-3AEA-1069-A2DD-08002B30309D}");
		if(!isDir){
			win.msgboxErr("文件夹名称错误!请重新输入。")
		}
		else {
			var password = string.load("/"+ mainForm.Dir.text +".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")
			if(mainForm.Password.text==password){
				process.popen.cmd('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne();
				fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config");
				process.popen.cmd('ren "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" "'+mainForm.Dir.text+'"').waitOne();
				win.msgboxTimeout("解密成功","提示",2000);
			}
			else {
				win.msgboxErr("密码错误!请重新输入。")
			}	
		}
	}
}
mainForm.show();
return win.loopMessage();


30 天前   #7

哈哈哈,去掉勾选隐藏受保护操作文件就能直接看到了。

不过谢谢分享。

30 天前   #8

感谢,感谢,学习了

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
加入本站专享群:783804676
AARDIO语言QQ大群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械
下载站:
非凡软件站



Loading...