用过FSO对象的人大概都知道它是一个很好用的对象,最近程序里再一次需要用到FSO对文件进行操作,不过遇到一个问题,就是它在复制时,程序会处于“假死”的状态,特别是复制大文件(100M以上的)时这样的情况特别严重,程序会一动不动,不知道各位有没有什么好的解决方法?
解决方案 »
- 下课贴被锁了,哈哈哈
- 如何在制作安装程序时,能让客户输入程序所要用到的SQL服务器的参数,如:名称,密码等
- 网络视频问题
- ActiveReport2.0高手请进~帮忙解决问题~~~在线等~
- 关于右键菜单,我怎么才能屏蔽他?
- 怎么才能打印网页?指用代码实现。我用SENDKEYS和KEYBHD_EVENT发CTRL+P,不行
- 在 EXCEL中加 分页符号等等标志的时候总是出错!!!
- 怎样为Data Report 报表加上表格线?
- 如何用API取得windows的Company名称?
- 我要 vb for dos !!!
- 请帮助,说用户类型未定义??????
- VB操纵EXCEL问题,退出的时候怎么去掉execel中是否保存的对话框?
Dim result As Long, fileop As SHFILEOPSTRUCT
With fileop
.hwnd = Me.hwnd
.wFunc = FO_COPY
.pFrom = "C:\PROGRAM FILES\MICROSOFT VISUAL BASIC\VB.HLP" & vbNullChar & "C:\PROGRAM FILES\MICROSOFT VISUAL BASIC\README.HLP" & vbNullChar & vbNullChar
.pFrom = "C:\*.*" & vbNullChar & vbNullChar
.pTo = "C:\testfolder" & vbNullChar & vbNullChar
.fFlags = FOF_SIMPLEPROGRESS Or FOF_FILESONLY
End With
result = SHFileOperation(fileop)
If result <> 0 Then
' Operation failed
MsgBox Err.LastDllError
Else
If fileop.fAnyOperationsAborted <> 0 Then
MsgBox "Operation Failed"
End If
End If
End Sub
====以下是模块====Public Const FO_MOVE As Long = &H1
Public Const FO_COPY As Long = &H2
Public Const FO_DELETE As Long = &H3
Public Const FO_RENAME As Long = &H4
Public Const FOF_MULTIDESTFILES As Long = &H1
Public Const FOF_CONFIRMMOUSE As Long = &H2
Public Const FOF_SILENT As Long = &H4
Public Const FOF_RENAMEONCOLLISION As Long = &H8
Public Const FOF_NOCONFIRMATION As Long = &H10
Public Const FOF_WANTMAPPINGHANDLE As Long = &H20
Public Const FOF_CREATEPROGRESSDLG As Long = &H0
Public Const FOF_ALLOWUNDO As Long = &H40
Public Const FOF_FILESONLY As Long = &H80
Public Const FOF_SIMPLEPROGRESS As Long = &H100
Public Const FOF_NOCONFIRMMKDIR As Long = &H200Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Long
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End TypeDeclare Function SHFileOperation Lib "Shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Dim Buffer() As Byte
Dim MaxLen As Integer
Dim Begin As Long
Dim Finish As Long
Dim F1 As Integer
Dim F2 As Integer
Dim Ln As Long
Dim j As Integer
j = 0
On Error GoTo 123:
BeginCopy = False
MaxLen = 4096
If Dir(Dest) <> "" Then
Begin = FileLen(Dest)
Else
Begin = 0
End If
Ln = Begin
If Dir(Source) <> "" Then
Finish = FileLen(Source)
Else
Exit Function
End If
F1 = FreeFile
Open Source For Binary Access Read As #F1
F2 = FreeFile
Open Dest For Binary Access Write As #F2
If Begin <> 0 Then
Seek #F1, Begin
Seek #F2, Begin
End If
ReDim Buffer(MaxLen)
Do
If (Ln + MaxLen + 1) < Finish Then
Get #F1, , Buffer
Put #F2, , Buffer
Ln = Ln + MaxLen + 1
Else
If Begin > 0 Then
Ln = Finish - Ln
Else
Ln = Finish - Ln - 1
End If
ReDim Buffer(Ln)
Get #F1, , Buffer
Put #F2, , Buffer
Exit Do
End If
DoEvents
Loop While j = 0
Close #F2
Close #F1
BeginCopy = True
Exit Function
123:
End Function
自定义拷贝,自己想做什么都行,还可以断点
ShFileOpeartion 有一个选项,可以在拷贝文件的时候不出现窗口的。这里是一个完整的实例,你可以看一下:http://vbnet.mvps.org/index.html?code/shell/shfileopadv.htm
这样不是会影响速度?
偶先LOOK,LOOK先谢两位。
Set sl = CreateObject("Shell.Application")
Set fd = sl.NameSpace("C:\目标文件夹\")
fd.CopyHere "E:\目标文件", 4
End Sub如想异步执行,可以用脚本文件,可以给你代码