以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助][求助]批量复制文件夹  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=148991)

--  作者:KWK001
--  发布时间:2020/4/20 21:56:00
--  [求助][求助]批量复制文件夹
批量复制文件夹,大文件复制时,在任务管理器,Foxtable 显示程序无响应,各位看看可不可以优化一下呢?

CellButtonClick

If e.Col.Name = "状态" Then
    e.Cancel=True
    Dim dlg As New FolderBrowserDialog
    Dim Folder1, Folder2 As String
    dlg.Description = "选择本地文件夹"
    If dlg.ShowDialog = DialogResult.Ok  Then
        MessageBox.Show("你选择的本地文件夹是:" & dlg.SelectedPath,"提示") 
    Folder1 = dlg.SelectedPath
    dlg.Description = "选择服务器文件夹"
    If dlg.ShowDialog = DialogResult.Ok  Then
        MessageBox.Show("你选择的备份文件夹是:" & dlg.SelectedPath,"提示")    
        Folder2 = dlg.SelectedPath
        e.Row("文件位置")=Folder1
        e.Row("服务器备份路径")=Folder2
        e.Row("状态")="已设置路径"
        Tables("表b").AutoSizeCols()
    End If
End If
End If



For Each r As Row In Tables("表b")
                    Dim Multi As String = r("文件位置")
                    Dim Multi2 As String = r("服务器备份路径")
                    try
                        FileSys.CopyDirectory (multi,Multi2,False)
                        catch
                    End try
                    Dim d As Date=today()
                    r("备份日期") = d
                Next


[此贴子已经被作者于2020/4/20 21:56:50编辑过]

--  作者:有点蓝
--  发布时间:2020/4/20 22:05:00
--  
就算直接在资源管理器复制大文件,整个电脑都卡的蜗牛样,没有办法的

最多试试这样
For Each r As Row In Tables("表b")
                    Dim Multi As String = r("文件位置")
                    Dim Multi2 As String = r("服务器备份路径")
                    try
                        FileSys.CopyDirectory (multi,Multi2,False)
application.doevents
                        catch
                    End try
                    Dim d As Date=today()
                    r("备份日期") = d
                Next

--  作者:KWK001
--  发布时间:2020/4/20 22:17:00
--  
蓝老师,怎么放个进度条或者显示用时,证明没有死机?
--  作者:有点蓝
--  发布时间:2020/4/20 22:29:00
--  
试试使用异步函数:http://www.foxtable.com/mobilehelp/topics/3269.htm
--  作者:KWK001
--  发布时间:2020/4/22 19:30:00
--  
蓝老师,我仿照做了一个,出现以下问题,再给我看看哪里可以优化。

好像Table、Datatable,窗口及窗口控件,菜单及菜单组件,都不应该在异步函数中调用

1、.NET Framework 版本:4.0.30319.42000
      Foxtable 版本:2020.1.19.19
       错误所在事件:自定义函数copy
        详细错误信息:
       调用的目标发生了异常。
        BindingSource 不能是自己的数据源。请不要将 DataSource 和 DataMember 属性设置为循环引用 BindingSource 的值。
2、执行主窗口_Button6_Click后,很快就显示 MessageBox.SHOW(" 更新 已完成 ! "),但是目标盘的文件实际还没有copy万了,这个怎么破解。
3、关闭窗口或退出程序后还会自动执行么?copy完了后怎么提示呢?




我的代码:

主窗口_Button6_Click

 

DataTables("b").deleteFor("文件位置 is null")

 

If Tables("b").Rows.Count = 0 Then \'这是空表

    MessageBox.SHOW(" 这是一个空白表,请设置后再执行! ","提示")

Else

    e.Form.Controls("Label1").Text =  "正在执行,不要关闭窗口,请稍后... ..."

    Application.DoEvents() \'即刻暂停代码的执行,重新绘制控件后,继续执行代码.

    For i As Integer = 1 To 100

        Functions.AsyncExecute("copy")

    Next

    Sleep (2000) \'等待2,待所有子线程线程执行完毕

    Tables("b").AutoSizeCols()

    e.Form.Controls("Label1").Text = " "

    MessageBox.SHOW(" 更新 已完成 ! ")

    DataTables.save

End If

 

自定义函数

 

Copy

 

For Each r As Row In Tables("b")

    Dim Multi As String = r("文件位置")

    Dim Multi2 As String = r("服务器备份路径")

    try

        FileSys.CopyDirectory (multi,Multi2,False)

        catch

    End try

    Dim d As Date=today()

    r("备份日期") = d

Next

 


全局代码

 

COPY

 

Public Copy As Integer


[此贴子已经被作者于2020/4/22 20:01:50编辑过]

--  作者:有点蓝
--  发布时间:2020/4/23 9:06:00
--  
先看懂代码,在用,不要只会照抄。

1、去掉循环

    For i As Integer = 1 To 100

        Functions.AsyncExecute("copy")

    Next

    Sleep (2000) \'等待2,待所有子线程线程执行完毕


改为
Functions.AsyncExecute("copy")
2、copy函数里不能使用table,改为使用SQLcommand从数据库里取数据

--  作者:KWK001
--  发布时间:2020/4/23 11:18:00
--  
蓝老师,我用的是内部表,要怎么改,有帮助吗?
--  作者:有点蓝
--  发布时间:2020/4/23 11:24:00
--  
参考:http://www.foxtable.com/webhelp/topics/0696.htm
--  作者:KWK001
--  发布时间:2020/4/23 15:32:00
--  

我还是不行啊,请蓝老师指教一下呢?

.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.4.19.8
错误所在事件:自定义函数,copy
详细错误信息:
调用的目标发生了异常。


Dim cmd As New SQLCommand
Dim dt As DataTable = cmd.ExecuteReader
cmd.CommandText = "select * Fro m {表b}"

For Each dr As DataRow In dt.DataRows
    Dim Multi As String = dr("文件位置")
    Dim Multi2 As String = dr("服务器备份路径")
    try
        FileSys.CopyDirectory (multi,Multi2,False)
        catch
    End try
    Dim d As Date=today()
    dr("备份日期") = d
Next


--  作者:有点蓝
--  发布时间:2020/4/23 15:40:00
--  
Dim cmd As New SQLCommand
cmd.CommandText = "select * Fro m {表b}"
Dim dt As DataTable = cmd.ExecuteReader

For Each dr As DataRow In dt.DataRows
    Dim Multi As String = dr("文件位置")
    Dim Multi2 As String = dr("服务器备份路径")
    try
        FileSys.CopyDirectory (multi,Multi2,False)
        catch
    End try
    Dim d As Date=today()
    dr("备份日期") = d
Next
dt.save