以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]如何利用递归函数对文件夹下所有文件加密  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=186624)

--  作者:洮沙
--  发布时间:2023/5/16 11:23:00
--  [求助]如何利用递归函数对文件夹下所有文件加密
老师,如何实现对文件夹A(包含若干子文件夹及文件)中所有文件进行加密后创建同结构文件夹B,知道用递归函数,看了半天,无从下手。麻烦老师写一下代码,谢谢!
--  作者:有点蓝
--  发布时间:2023/5/16 11:32:00
--  
假设函数名称:abc,函数内容

dim dir as string
For Each fl As String In FileSys.GetFiles(dir)
对文件的处理
next
For Each dir2 As String In FileSys.GetDirectories(dir) 如果有子目录
  
Functions.Execute("abc",dir2 
Next

按钮
For Each dir2 As String In FileSys.GetDirectories("文件夹A的路径")
  
Functions.Execute("abc",dir2 )
Next

--  作者:洮沙
--  发布时间:2023/5/16 11:40:00
--  
感谢老师回复,再麻烦问一下如何将加密后文件创建同结构文件夹?
--  作者:有点蓝
--  发布时间:2023/5/16 11:47:00
--  
http://www.foxtable.com/webhelp/topics/0331.htm
--  作者:洮沙
--  发布时间:2023/5/16 11:58:00
--  
老师,测试二楼代码,出现以下错误:
.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2022.8.18.1
错误所在事件:自定义函数,abc
详细错误信息:
调用的目标发生了异常。
值不能为 null。
参数名: path


--  作者:有点蓝
--  发布时间:2023/5/16 13:28:00
--  
dim dir as string
改为
dim dir as string = args(0)

--  作者:洮沙
--  发布时间:2023/5/16 14:33:00
--  

老师,参照您的解答,编写以下代码,以下红色部分没有执行,再次麻烦您修改以下,感谢!

全局代码:
Public FLn As Integer = 0
Public FLold As String
Public FLnew As String

“文件加密”内部函数代码:
Dim dir As String = args(0)
For Each fl As String In FileSys.GetFiles(dir)
    EncryptFile(fl, fl.Replace(FLold, FLnew), "Qtkj")                           \'没有执行
    FLn = FLn + 1
Next
For Each dir2 As String In FileSys.GetDirectories(dir) \'如果有子目录
    If FileSys.DirectoryExists(dir2.Replace(FLold, FLnew)) Then \'如果目录不存在
    Else
        FileSys.CreateDirectory(dir2.Replace(FLold, FLnew))                        \'没有执行                 
    End If
    Functions.Execute("文件加密", dir2) 
Next


按钮代码:
Dim dxg1 As WinForm.TextBox = e.Form.Controls("TextBox1")
Dim dxg2 As WinForm.TextBox = e.Form.Controls("TextBox2")
If dxg1.Text = Nothing Then
    MessageBox.Show("请先选择【源文件夹】!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    dxg1.Select() \'焦点控件
    Return 
End If
If dxg2.Text = Nothing Then
    MessageBox.Show("请先选择【加密后文件夹】!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    dxg2.Select() \'焦点控件
    Return 
End If
\'全局代码赋值
FLold = dxg1.Text
FLnew = dxg2.Text

\'执行文件加密递归函数
For Each dir2 As String In FileSys.GetDirectories(FLold) 
    Functions.Execute("文件加密", dir2)
Next
MessageBox.Show("加密成功【" & FLn & "】个文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)      ’FLn计数为4不正确,应该是5
\'恢复全局代码初始值
FLold = ""
FLnew = ""
FLn = 0
\'打开加密后文件夹
Dim proc As New Process
proc.File = dxg2.Text
proc.Start

源文件夹结构为:

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20230516143059.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20230516143111.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2023/5/16 14:42:12编辑过]

--  作者:有点蓝
--  发布时间:2023/5/16 14:39:00
--  
1、加密用EncryptFilehttp://www.foxtable.com/webhelp/topics/1346.htm

2、目录必须先创建,才能往里存放文件

--  作者:洮沙
--  发布时间:2023/5/16 14:45:00
--  
EncryptFile自己疏忽了,另外问一下老师,递归函数中怎么动态增加文件夹?
--  作者:有点蓝
--  发布时间:2023/5/16 14:49:00
--  
FileSys.CreateDirectory