ID do artigo: 172711 - Última revisão: sábado, 20 de janeiro de 2007 - Revisão: 3.1

ACC: Declaração FileCopy não pode copiar abrir arquivos

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Avançadas: Requer especialista de codificação, interoperabilidade e habilidades de multiusuário.

Nesta página

Expandir tudo | Recolher tudo

Sintomas

Ao copiar programaticamente um arquivo com a declaração FileCopy no Visual Basic for Applications, você receberá a seguinte mensagem de erro:
Erro em tempo de execução '70'

Permissão negada

Este artigo presume que você esteja familiarizado com Visual Basic for Applications e com a criação de aplicativos do Microsoft Access usando as ferramentas de programação fornecidas com o Microsoft Access. Para obter mais informações sobre o Visual Basic for Applications, consulte sua versão do manual "Criando aplicativos com o Microsoft Access".

Causa

O arquivo é aberto no momento, o que impede a declaração FileCopy de copiar o arquivo.

Resolução

Em vez de usar a declaração FileCopy, use um dos seguintes métodos para copiar programaticamente o arquivo.

Aviso: As funções a seguintes permitem que você copiar um arquivo aberto. Se o arquivo de origem for alterado enquanto a operação de cópia estiver em andamento, o arquivo de destino pode estar incompleto ou pode estar corrompido.

Método 1 - chamar a função CopyFile() do API do Windows

Um método para copiar programaticamente um arquivo é chamar a função CopyFile() do API do Microsoft Windows. Para chamar a função CopyFile() do API do Microsoft Windows, execute essas etapas:
  1. Conclua a seção as etapas 1 a 4 do "passos para reproduzir o problema" mostrados posteriormente neste artigo.
  2. Criar um módulo e digite as seguintes linhas na declaração seção:
          Option Explicit
    						
          Declare Function apiCopyFile Lib "kernel32" Alias "CopyFileA" _
          (ByVal lpExistingFileName As String, _
          ByVal lpNewFileName As String, _
          ByVal bFailIfExists As Long) As Long
    						
  3. Digite o seguinte procedimento:
          Sub CopyFile(SourceFile As String, DestFile As String)
          '---------------------------------------------------------------
          ' PURPOSE: Copy a file on disk from one location to another.
          ' ACCEPTS: The name of the source file and destination file.
          ' RETURNS: Nothing
          '---------------------------------------------------------------
            Dim Result As Long
             If Dir(SourceFile) = "" Then
                MsgBox Chr(34) & SourceFile & Chr(34) & _
                   " is not valid file name."
             Else
                Result = apiCopyFile(SourceFile, DestFile, False)
             End If
          End Sub
    						
  4. Para testar esse procedimento, digite a seguinte linha na janela Verificação imediata e, em seguida, pressione ENTER:

    CopyFile "< caminho para Northwind.mdb >", "C:\Northwind.mdb"

    Observe que Northwind.mdb é copiado para a pasta raiz da unidade C, mesmo que ele seja aberto em outra instância do Microsoft Access.

Método 2 - chamar o comando copy do MS-DOS

Outro método para copiar programaticamente um arquivo é chamar o comando copy do MS-DOS de uma função Shell() no Visual Basic for Applications. Para chamar o comando copy do MS-DOS, execute estas etapas:
  1. Conclua a seção as etapas 1 a 4 do "passos para reproduzir o problema" mostrados posteriormente neste artigo.
  2. Crie um módulo e o tipo a seguinte linha na declaração seção se não estiver já existe:
          Option Explicit
    						
  3. Se você estiver usando o Microsoft Windows 95, digite o seguinte procedimento:
          Sub CopyFile(SourceFile As String, DestFile As String)
          '---------------------------------------------------------------
          ' PURPOSE: Copy a file on disk from one location to another.
          ' ACCEPTS: The name of the source file and destination file.
          ' RETURNS: Nothing
          '---------------------------------------------------------------
             Dim CopyString As String
             If Dir(SourceFile) = "" Then
                MsgBox Chr(34) & SourceFile & Chr(34) & _
                   " is not a valid file name."
             Else
                SourceFile = Chr(34) & SourceFile & Chr(34)
                DestFile = Chr(34) & DestFile & Chr(34)
                CopyString = "COMMAND.COM /C COPY " & SourceFile & _
                   " " & DestFile
                Call Shell(CopyString, 0)
             End If
          End Sub
    
       If you are using Microsoft Windows NT, use the same procedure, but
       change the line
    
          CopyString = "COMMAND.COM /C COPY " & SourceFile & _
    
       to:
    
          CopyString = "CMD.EXE /C COPY " & SourceFile & _
    						
  4. Para testar esse procedimento, digite a seguinte linha na janela Verificação imediata e, em seguida, pressione ENTER:

    CopyFile "< caminho para Northwind.mdb >", "C:\Northwind.mdb"

    Observe que Northwind.mdb é copiado para a pasta raiz da unidade C, mesmo que ele seja aberto em outra instância do Microsoft Access.

Situação

Esse comportamento é por design.

Mais Informações

Etapas para reproduzir o problema


  1. Inicie o Microsoft Access.
  2. Abra o banco de dados de exemplo Northwind.mdb.
  3. Inicie uma nova instância do Microsoft Access.
  4. Crie um novo banco de dados em branco.
  5. Crie um módulo e o tipo a seguinte linha na declaração seção se não estiver já existe:
          Option Explicit
    						
  6. Digite o seguinte procedimento:
          Sub CopyFile(SourceFile As String, DestFile As String)
             FileCopy SourceFile, DestFile
          End Sub
    						
  7. Para testar esse procedimento, digite a seguinte linha na janela Verificação imediata e, em seguida, pressione ENTER:

    CopyFile "< caminho para Northwind.mdb >", "C:\Northwind.mdb"

    Observe que você recebe o erro listado na seção "Sintomas".

Referências

Para obter mais informações sobre a declaração FileCopy, procure no índice da Ajuda por "Declaração FileCopy."

A informação contida neste artigo aplica-se a:
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palavras-chave: 
kbmt kbprb kbprogramming KB172711 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 172711  (http://support.microsoft.com/kb/172711/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.