none
Deletando arquivos com atributo somente leitura RRS feed

  • Pergunta

  •  

    Pessoal,

     

     

    Criei um script para deletar arquivos e subpastas de uma determinada pasta tá blz só tem um problema não como força para que delete os arquivos que estão com o atributo somente leitura marcado, esses dão erro de "Permissão negada". Abaixo segue meu script:

     

    'Script Deletando arquivos e subpasta e gerando um logfile.
    'Por Leonardo Couto Conrado.

    Option Explicit


    Dim Path, FileLog, Arquivo, ArquivoSize
    Dim ObjFSO, Folder, MyFiles, MySubFolders, MyFolder
    Dim ObjFileRead, ObjFileWrite, ObjFileAppending
    Dim NomeFileDeleted, NomeFolderDeleted
    Dim ActionDel, i

    On error resume next

    Path = "C:\driver" 'Local onde serão deletados arquivo e subpastas
    FileLog = "logfile.txt"
    ActionDel = "no"
    Const ForReading = 1, ForWriting = 2, ForAppending = 8

     


    Set ObjFSO = CreateObject("Scripting.FileSystemObject")


    VerifySizeLog FileLog
    Set Folder = ObjFSO.GetFolder(Path)
    Set MyFiles = Folder.files
    Set MySubFolders = Folder.SubFolders
    Set ObjFileRead = ObjFSO.opentextfile(FileLog, ForReading, True)
    Set ObjFileAppending = ObjFSO.opentextfile(FileLog, ForAppending, True)
    'Set ObjFileWrite = ObjFSO.opentextfile(FileLog, ForWriting, True)
     
     
     
    If Not ObjFSO.FolderExists(Path) Then
      WriteLog Path & " - não é uma pasta válida(A pasta não existe)."
     wscript.echo FileLog
      WScript.Quit
    End If

    i=0
    IF MyFiles.Count <> 0 Then
     For Each MyFiles in Folder.Files
      NomeFileDeleted = MyFiles.Name
     
      MyFiles.Delete
      if Err.number <> 0 then
       WriteLog Err.Description&". !!! Erro ao tentar deletar o arquivo "& Path &"\"&NomeFileDeleted
       Err.Clear
       else
        WriteLog Path &"\"&NomeFileDeleted &" - Arquivo deletado em "& now()
        i=i+1
      end if
      ActionDel = "yes"
     Next
    end if

    IF MySubFolders.Count <> 0 Then
     For each MyFolder in MySubFolders
      NomeFolderDeleted = MyFolder.Name
      MyFolder.delete
      
      if Err.number <> 0 then
       WriteLog Err.Description&". Erro ao tentar deletar a pasta "& Path &"\"&NomeFolderDeleted
       Err.Clear
       else
        WriteLog Path &"\"&NomeFolderDeleted &" - PASTA deletada em "& now()
        i=i+1
      end if
      ActionDel = "yes"
     Next
    end if
      

    if ActionDel = "yes" then
     WriteLog "-------------------------------------FIM---------------------------------TOTAL DE "& i &" OBJETOS DELETADOS---"
    end if


    Function WriteLog (Text)
     ObjFileAppending.WriteLine Text
    End Function

    Function VerifySizeLog(NameFile)
     Set ObjFSO = CreateObject("Scripting.FileSystemObject")
     Set ObjFileRead = ObjFSO.opentextfile(NameFile, ForReading, True)
     Set Arquivo = ObjFSO.GetFile(NameFile)
     ArquivoSize = Arquivo.size
     'wscript.echo ArquivoSize
     if  ArquivoSize >= 1240000 then
      ObjFileRead.close
      Arquivo.name = "LOG FECHADO EM "& Replace(FormatDateTime(now,2),"/","-")&".txt"
      
     elseif ArquivoSize <= 1000024 then
      FileLog = NameFile
     end if

    End Function  
      
      
      
      
      
      
      
      
      
      
      
      

    terça-feira, 1 de julho de 2008 20:34

Respostas

  • Olá Leonardo,


    estou com pouco tempo, e nem revisei teu script. Mas ficam aqui minhas dicas:

    1) Você pode limpar o atributo de somente-leitura. Basta setar a propriedade Attributes do arquivo para zero antes de deletar:

    objFile.attributes = 0
    objFile.Delete

    2) Há um parâmetro no método que apaga arquivos que indica se ele deve tentar "forçar" arquivos somente-leitura a serem apagados

    3) Você não vai conseguir apagar arquivos aos quais não tenha permissão, mesmo que você seja admin. você deve antes tomar propriedade na pasta, subpasta e arquivos e só então apagar os arquivos. Isso se deve ao fato do VBS não possuir nenhum recurso para trabalhar nativamente com ACLs do NTFS.

    4) Você não pode apagar arquivos em uso. Se uma pasta tiver um arquivo em uma de suas subpastas que está em uso, voê não vai conseguir apagar nada recursivamente. Isso vale para qualquer SO, seja ele Windows ou Linux.

    []s,


    Vinicius Canto
    MVP Admin Frameworks
    site sobre scripting: http://viniciuscanto.blogspot.com
    terça-feira, 1 de julho de 2008 22:37
    Moderador
  • Vinicius,

     

     

    Das alternativas acima segui a seguinte:

     

    Adcionei ao loop que coleta os arquivos dentro da pasta raiz a propriedade "attributes=0" e funcionou 100% veja como ficou o loop:

     

    IF MyFiles.Count <> 0 Then
     For Each MyFiles in Folder.Files
      NomeFileDeleted = MyFiles.Name
      MyFiles.attributes = 0 ' Propriedade attributes adicionada para remover o atributo somente leitura do arquivo
      MyFiles.Delete
      if Err.number <> 0 then
       WriteLog Err.Description&". !!! Erro ao tentar deletar o arquivo "& Path &"\"&NomeFileDeleted
       Err.Clear
       else
        WriteLog Path &"\"&NomeFileDeleted &" - Arquivo deletado em "& now()
        i=i+1
      end if
      ActionDel = "yes"
     Next
    end if

     

     

    Obrigado!

    quarta-feira, 2 de julho de 2008 16:12

Todas as Respostas

  • Olá Leonardo,


    estou com pouco tempo, e nem revisei teu script. Mas ficam aqui minhas dicas:

    1) Você pode limpar o atributo de somente-leitura. Basta setar a propriedade Attributes do arquivo para zero antes de deletar:

    objFile.attributes = 0
    objFile.Delete

    2) Há um parâmetro no método que apaga arquivos que indica se ele deve tentar "forçar" arquivos somente-leitura a serem apagados

    3) Você não vai conseguir apagar arquivos aos quais não tenha permissão, mesmo que você seja admin. você deve antes tomar propriedade na pasta, subpasta e arquivos e só então apagar os arquivos. Isso se deve ao fato do VBS não possuir nenhum recurso para trabalhar nativamente com ACLs do NTFS.

    4) Você não pode apagar arquivos em uso. Se uma pasta tiver um arquivo em uma de suas subpastas que está em uso, voê não vai conseguir apagar nada recursivamente. Isso vale para qualquer SO, seja ele Windows ou Linux.

    []s,


    Vinicius Canto
    MVP Admin Frameworks
    site sobre scripting: http://viniciuscanto.blogspot.com
    terça-feira, 1 de julho de 2008 22:37
    Moderador
  • Vinicius,

     

     

    Das alternativas acima segui a seguinte:

     

    Adcionei ao loop que coleta os arquivos dentro da pasta raiz a propriedade "attributes=0" e funcionou 100% veja como ficou o loop:

     

    IF MyFiles.Count <> 0 Then
     For Each MyFiles in Folder.Files
      NomeFileDeleted = MyFiles.Name
      MyFiles.attributes = 0 ' Propriedade attributes adicionada para remover o atributo somente leitura do arquivo
      MyFiles.Delete
      if Err.number <> 0 then
       WriteLog Err.Description&". !!! Erro ao tentar deletar o arquivo "& Path &"\"&NomeFileDeleted
       Err.Clear
       else
        WriteLog Path &"\"&NomeFileDeleted &" - Arquivo deletado em "& now()
        i=i+1
      end if
      ActionDel = "yes"
     Next
    end if

     

     

    Obrigado!

    quarta-feira, 2 de julho de 2008 16:12
  • Muito bom, legal mesmo!


    []s,

    Vinicius Canto
    MVP Windows Server - Admin Frameworks
    Blog sobre scripting: http://viniciuscanto.blogspot.com

    sexta-feira, 4 de julho de 2008 12:18
    Moderador