我需要拷贝局域网内一个MDB数据库文件,该数据库文件无密码,但是该文件始终被某一程序打开(因采集的数据以每秒入库),我用FileCopy出现“实时的错误70:拒绝的权限”,可是从资源管理器中却可以拷贝该文件,我需要怎么做才能拷贝啦?谢谢各位。

解决方案 »

  1.   

    '用API函数SHFileOperation
    Private Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String '只有在 FOF_SIMPLEPROGRESS 时用
    End TypePrivate Declare Function SHFileOperation Lib _
    "shell32.dll" Alias "SHFileOperationA" (lpFileOp _
    As SHFILEOPSTRUCT) As Long'wFunc 常数
    'FO_COPY   把 pFrom 文件拷贝到 pTo。
    Const FO_COPY = &H2
    'FO_DELETE 删除 pFrom 中的文件(pTo 忽略)。
    Const FO_DELETE = &H3
    'FO_MOVE   把 pFrom 文件移动到 pTo。
    Const FO_MOVE = &H1'fFlag 常数
    'FOF_ALLOWUNDO 允许 Undo 。
    Const FOF_ALLOWUNDO = &H40
    'FOF_NOCONFIRMATION 不显示系统确认对话框。
    Const FOF_NOCONFIRMATION = &H10
    'FOF_NOCONFIRMMKDIR 不提示是否新建目录。
    Const FOF_NOCONFIRMMKDIR = &H200
    'FOF_SILENT 不显示进度对话框
    Const FOF_SILENT = &H4'拷贝例子:
    Dim SHFileOp As SHFILEOPSTRUCT
    SHFileOp.wFunc = FO_COPY
    SHFileOp.pFrom = "c:\tmp.mdb"
    SHFileOp.pTo = "d:\"
    SHFileOp.fFlags = FOF_ALLOWUNDO + FOF_NOCONFIRMMKDIR + FOF_SILENT
    Call SHFileOperation(SHFileOp)
    Call SHFileOperation(SHFileOp)
      

  2.   

    这个就是Windows本身文件操作所用的函数(比如在资源管理器中操作),还可以进行删除、移动等其中fFlags参数可以是fFlag常数的任意组合相加
      

  3.   

    viena(维也纳nn-实心木头人) :
    我将代码拷贝到模块中,同时写了如下函数供其它调用,运行中提示“实时的错误49:DLL调用约定错误”,在分析一下,那里错啦:
    Public Sub CopyMdb(ByVal FromFile As String, ByVal ToFile As String)
    Dim SHFileOp As SHFILEOPSTRUCT  '拷贝例子:
    SHFileOp.wFunc = FO_COPY
    SHFileOp.pFrom = FromFile
    SHFileOp.pTo = ToFile
    SHFileOp.fFlags = FOF_NOCONFIRMMKDIR + FOF_SILENT
    Call SHFileOperation(SHFileOp)
    End Sub
      

  4.   

    不会吧,我试了没问题啊,以下代码在我这儿运行没有任何问题'Form中
    Public Sub CopyMdb(ByVal FromFile As String, ByVal ToFile As String)
        Dim SHFileOp As SHFILEOPSTRUCT  '拷贝例子:
        SHFileOp.wFunc = FO_COPY
        SHFileOp.pFrom = FromFile
        SHFileOp.pTo = ToFile
        SHFileOp.fFlags = FOF_NOCONFIRMMKDIR + FOF_SILENT
        Call SHFileOperation(SHFileOp)
    End SubPrivate Sub Command1_Click()
        Call CopyMdb("D:\test.mdb", "E:\")
    End Sub'模块中
    Public Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String '只有在 FOF_SIMPLEPROGRESS 时用
    End TypePublic Declare Function SHFileOperation Lib _
    "shell32.dll" Alias "SHFileOperationA" (lpFileOp _
    As SHFILEOPSTRUCT) As LongPublic Const FO_COPY = &H2Public Const FOF_ALLOWUNDO = &H40
    Public Const FOF_NOCONFIRMATION = &H10
    Public Const FOF_NOCONFIRMMKDIR = &H200
    Public Const FOF_SILENT = &H4
      

  5.   

    是不是操作系统版本不一样啊,我的是Win2000 P
      

  6.   

    Public都改回去,CopyMdb放在模块里,也没有问题
      

  7.   

    'Form中
    Public Sub CopyMdb(ByVal FromFile As String, ByVal ToFile As String)
        Dim SHFileOp As SHFILEOPSTRUCT  '拷贝例子:
        SHFileOp.wFunc = FO_COPY
        SHFileOp.pFrom = FromFile
        SHFileOp.pTo = ToFile
        SHFileOp.fFlags = FOF_NOCONFIRMMKDIR + FOF_SILENT
        Call SHFileOperation(SHFileOp)
    End SubPrivate Sub Command1_Click()
        Call CopyMdb("D:\test.mdb", "E:\")
    End Sub
    '---------------------------------------------------------
    这样放置代码,运行提示:
    Dim SHFileOp As SHFILEOPSTRUCT  '用户定义类型未定义
    模块中已经定义了,难道我的不支持自定义数据结构?不会吧,
    我的xp  p+vb6
      

  8.   

    Dim SHFileOp As SHFILEOPSTRUCT  '用户定义类型未定义
    修改PrivateType SHFILEOPSTRUCT 为 Public Type SHFILEOPSTRUCT 得到解决可是还提示“实时的错误49:DLL调用约定错误”,那里错啦? 55555555.
      

  9.   

    找到问题了,申明 Public Declare Function SHFileOperation Lib _
    "shell32.dll" Alias "SHFileOperationA" (lpFileOp _
    As SHFILEOPSTRUCT) 时这里少了---> As Long,没有错误提示了,可是文件没有拷贝成功,怪了,模块代码同viena(维也纳nn-实心木头人) ,Form中代码如下,看一看还有没问题,我没看出来:Private Sub CopyMdb(ByVal FromFile As String, ByVal ToFile As String)
    Dim SHFileOp As SHFILEOPSTRUCT  
    SHFileOp.wFunc = FO_COPY
    SHFileOp.pFrom = FromFile
    SHFileOp.pTo = ToFile
    SHFileOp.fFlags = FOF_NOCONFIRMMKDIR + FOF_SILENT
    Call SHFileOperation(SHFileOp)
    End SubPrivate Sub CmdGetDat_Click()
    Dim cNetMdbFile As String, cAppMdbFile As String
    cNetMdbFile = m_NetPath & "data_base.mdb"
    If FileCheck(cNetMdbFile) = False Then
      MsgBox "Îļþ" & cNetMdbFile & "²»´æÔÚ£¡ÇëËÙÓëϵ¡£"
      Exit Sub
    End If
    cAppMdbFile = App.Path & "\Dat\BASE.MDB"
    Call CopyMdb(cNetMdbFile, cAppMdbFile)
    End Sub
      

  10.   

    同意 viena(维也纳nn-实心木头人) ,搂主有点粗心,再仔细检查其代码。
      

  11.   

    谢谢viena(维也纳nn-实心木头人),问题在我,现已解决,顺便问一下:
    Const FOF_SILENT = &H4 ''FOF_SILENT 不显示进度对话框
    请问那显示进度对话框的常数值为多少?
    解决后马上结贴。