Pergunta

Em 2010 do Excel VBA, eu estou usando a propriedade FileExists do FileSystemObject para verificar se um arquivo existe.No meu computador ele funciona muito bem.Mas em outro Excel 2010 computador, ele informa que o arquivo não estiver lá, quando na verdade vemos no Explorador do Windows que o arquivo está lá.Em ambos os casos, o arquivo a ser verificado é a unidade de disco rígido local.

Estou verificando o arquivo logo após usar o Shell para descompactar o arquivo.Eu uso DoEvents após o descompacte.O arquivo está sendo extraído para a mesma pasta que o arquivo zip está.

Aqui está o código:

Dim oShell As Object, oZippedFile As Object, oUnzipTargetFolder As Object
Dim FSO As Object, oFile As Object, oFolder As Object
Dim strZipfileFullpath As Variant, strTargetFolderpath As Variant, strTargetFullpath As Variant 'NOT AS STRINGS!! (Shell error if strings)
Dim bFileCheckFsoFileExist As Boolean

Set oShell = CreateObject("shell.application")
Set FSO = CreateObject("scripting.filesystemobject")

strZipfileFullpath = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", MultiSelect:=False)

Set oFile = FSO.GetFile(strZipfileFullpath)
Set oFolder = oFile.ParentFolder
strTargetFolderpath = oFolder.Path & Application.PathSeparator
strTargetFullpath = strTargetFolderpath & oShell.Namespace(strZipfileFullpath).Items.Item(0).Name

oShell.Namespace(strTargetFolderpath).CopyHere oShell.Namespace(strZipfileFullpath).Items.Item(0) 'this zip has only one file.
DoEvents

bFileCheckFsoFileExist = FSO.FileExists(strTargetFullpath)

Alguma idéia de por que isso funciona bem em um computador, mas em outro computador reporta que o arquivo não está aí, mesmo que nós vemos que claramente é?

ATUALIZAÇÃO:

Eu pensei que eu iria adicionar esta nota no caso, pode ser útil para os outros em execução no mesmo obstáculo.

O básico subjacente problema foi que quando usando o Shell para extrair um arquivo zipado, a propriedade de Nome de arquivo zipado objeto não inclui a extensão Se o Windows Explorer está escondendo e as extensões de arquivo tem uma extensão registrado.Por exemplo:

Dim strGofnZipfileFullpath As Variant
Dim oShell As Object, oShellZipfile As Object, oShellZippedFileInZipfile As Object
Dim strShellZippedFileInZipfileFilename As Variant 'NOT AS STRINGS!! (Shell error if strings)

strGofnZipfileFullpath = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", MultiSelect:=False)

Set oShell = CreateObject("shell.application")
Set oShellZipfile = oShell.Namespace(strGofnZipfileFullpath)
Set oShellZippedFileInZipfile = oShellZipfile.Items.Item(0) 'assumes only 1 file in zip. 
        strShellZippedFileInZipfileFilename = oShellZippedFileInZipfile.Name

Se o Windows Explorer está definido para ocultar as extensões e o arquivo zipado tem uma extensão registrado, strShellZippedFileInZipfileFilename não incluir a extensão.

No entanto, o arquivo compactado (objeto oShellZippedFileInZipfile) também tem uma propriedade de Caminho, que inclui a extensão.Assim você pode obter o nome do arquivo, incluindo a extensão como este:

strShellZippedFileInZipfileFilename = Right(oShellZippedFileInZipfile.Path, InStr(StrReverse(oShellZippedFileInZipfile.Path), Application.PathSeparator) - 1)
Foi útil?

Solução

Uma coisa a ter em mente são as opções de pastas no Windows Explorer.Isso pode não ajudá-lo neste caso, mas tive várias interações do FSO que tenham um problema enorme com como os arquivos são exibidos no Windows Explorer.Algo tão simples quanto seu sistema é exibir a extensão do arquivo, e o outro não é, às vezes pode ser o culpado em procurar arquivos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top