ayuda eliminar archivo varias veces..

Iniciado por musicaward, 17 Enero 2009, 13:26 PM

0 Miembros y 1 Visitante están viendo este tema.

musicaward

hola primero que nada un saludo a toda esta gran comunidad... quisiera saber si me podrian ayudar...

No se si se podria colocar un timer... con la funcion kill para que elimine cierto archivo cada x segundos... que se encuentre por ejemplo .. en :

C:\archivo.txt

y que no cause error cuando no lo encuentre..

porque si uso la funcion kill... solo lo elimina una vez.. pero quiero que elimine tal archivo cada vez que lo vea en esa ruta...

o en todo caso... se podria hacer ? que "archivo.txt" no tenga permisos de escribir ni ejecutarse desde vb?...

gracias..

skapunky

Lo ideal, esque utilizes fileexists y si existe el archivo eliminarlo, aunque hay la forma cutre....

on error resume next
kill "loquequieras"
...


Saludos.
Killtrojan Syslog v1.44: ENTRAR

musicaward

#2
Citaron error resume next
kill "loquequieras"
...

si pero con esa funcion solo lo puedo eliminar "una" vez... como podria hacer.. para que al hacer click... o check .. elimine tal archivo varias veces..o sea aunq vuelva a colocar por ejemplo ese archivo en esa ruta mientras ande activado ... lo "elimine"  ubicado en :

CitarC:\archivo.txt

no se si se podria hacer con un timer.. o algo similar... no se si me dejo a entender..

gracias igual...

seba123neo

para salir de paso usa un Timer, aunque hay una posibilidad de poder detectar cuando se crea un archivo en una carepta sin Timer, con Apis que monitorean...y si existe lo borras...en el api-guide hay un ejemplo...

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

musicaward

#4
Citarpara salir de paso usa un Timer, aunque hay una posibilidad de poder detectar cuando se crea un archivo en una carepta sin Timer, con Apis que monitorean...y si existe lo borras...en el api-guide hay un ejemplo...

saludos.

me interesa mucho eso es justo lo que ando buscando... podreis citar.. el ejemplo o decirme el nombre  , disculpa es que no se donde buscarlo.... gracias

aaronduran2

Algo sencillo, con un Timer en el formulario:

Código (vb) [Seleccionar]
Private Sub Timer1_Timer()
    On Error Resume Next
    Kill Environ("HOMEDRIVE") & "\Archivo.txt"
End Sub


Pon el Timer con el intervalo de tiempo que quieras que pase antes de comprobar si existe y eliminar el archivo.

Saludos  ;)

seba123neo

#6
si yo decia lo mismo, pero sin timer...cuando detecte que existe que lo elimine, yo hice un programa asi que detecta cuando existe o se cambia un archivo...esperame que edito el post y te paso un ejemplo:

necesitas 2 botones, uno para emepezar y el otro para parar el monitoreo de la carpeta..


Código (vb) [Seleccionar]
Option Explicit

Private Const TIME_OUT = &H102
Private Const FILE_SHARE_DELETE = &H4
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FILE_ALL_ACCESS = &H1FF

Private Const FILE_LIST_DIRECTORY = &H1
Private Const OPEN_EXISTING = &H3
Private Const FILE_FLAG_BACKUP_SEMANTICS = &H2000000
Private Const FILE_FLAG_OVERLAPPED = &H40000000
Private Const FILE_ATTRIBUTE_NORMAL = &H80

Private Enum FILE_NOTIFY_CHANGE
    FILE_NOTIFY_CHANGE_FILE_NAME = &H1
    FILE_NOTIFY_CHANGE_DIR_NAME = &H2
    FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4
    FILE_NOTIFY_CHANGE_SIZE = &H8
    FILE_NOTIFY_CHANGE_LAST_WRITE = &H10
    FILE_NOTIFY_CHANGE_LAST_ACCESS = &H20
    FILE_NOTIFY_CHANGE_CREATION = &H40
    FILE_NOTIFY_CHANGE_SECURITY = &H100
End Enum

Private Enum FILE_ACTION
    FILE_ACTION_ADDED = &H1
    FILE_ACTION_REMOVED = &H2
    FILE_ACTION_MODIFIED = &H3
    FILE_ACTION_RENAMED_OLD_NAME = &H4
    FILE_ACTION_RENAMED_NEW_NAME = &H5
End Enum

Private Type OVERLAPPED
    Internal As Long
    InternalHigh As Long
    offset As Long
    OffsetHigh As Long
    hEvent As Long
End Type

Private Type FILE_NOTIFY_INFORMATION
    dwNextEntryOffset As Long
    dwAction As FILE_ACTION
    dwFileNameLength As Long
    wcFileName(1024 - 1) As Byte 'Buffer de 1024 bytes
End Type

Private Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (ByVal lpEventAttributes As Long, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long
Private Declare Function GetOverlappedResult Lib "kernel32" (ByVal hFile As Long, lpOverlapped As OVERLAPPED, lpNumberOfBytesTransferred As Long, ByVal bWait As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function ReadDirectoryChangesW Lib "kernel32.dll" (ByVal hDirectory As Long, ByVal lpBuffer As Long, ByVal nBufferLength As Long, ByVal bWatchSubtree As Boolean, ByVal dwNotifyFilter As FILE_NOTIFY_CHANGE, lpBytesReturned As Long, ByVal lpOverlapped As Long, ByVal lpCompletionRoutine As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)

'Variable para el monitoreo
Dim fstop As Boolean

Private Sub Command1_Click()

    Dim hDir As Long 'Handle del Directorio
    Dim hEvent As Long 'Handle del Evento
   
    fstop = False
   
    'aca pones la carpeta a monitorear y le pasa todos los flags
    hDir = CreateFile("C:\", FILE_LIST_DIRECTORY, FILE_SHARE_READ Or FILE_SHARE_DELETE Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS Or FILE_FLAG_OVERLAPPED, 0&)
   
    'Crea el evento
    hEvent = CreateEvent(0&, True, True, "DirEvent")
   
    Dim oLap As OVERLAPPED
   
    With oLap
        .hEvent = hEvent
    End With
   
    Dim buf(0 To 1024 * 5 - 1) As Byte
   
    'para obtener la info del archivo
    Dim dirBuf As FILE_NOTIFY_INFORMATION
   
    Dim nUsed As Long
   
    Call ReadDirectoryChangesW(hDir, VarPtr(buf(0)), UBound(buf) + 1, True, FILE_NOTIFY_CHANGE_FILE_NAME, nUsed, VarPtr(oLap), 0&)
       
    Dim bstr As String 'para el nombre del archivo
    Dim pos As Long 'para la ruta
    Dim ret As Long
   
    Do
        pos = 0
        'esperamos un evento
        ret = WaitForSingleObject(hEvent, 100)
        If ret <> TIME_OUT Then
            CopyMemory VarPtr(dirBuf), VarPtr(buf(pos)), Len(dirBuf)
            Debug.Print dirBuf.dwFileNameLength & " " & dirBuf.dwNextEntryOffset
           
            Select Case dirBuf.dwAction
                Case FILE_ACTION_ADDED:
                    Debug.Print "Creaste ";
                Case FILE_ACTION_MODIFIED:
                    Debug.Print "Modificaste ";
                Case FILE_ACTION_REMOVED:
                    Debug.Print "Borraste ";
                Case FILE_ACTION_RENAMED_NEW_NAME:
                    Debug.Print "Renombraste a ";
                Case FILE_ACTION.FILE_ACTION_RENAMED_OLD_NAME:
                    Debug.Print "Nombre Anterior ";
            End Select

            bstr = dirBuf.wcFileName
            bstr = Left(bstr, dirBuf.dwFileNameLength / 2)
            Debug.Print bstr
           
            While dirBuf.dwNextEntryOffset <> 0
           
                pos = pos + dirBuf.dwNextEntryOffset
                CopyMemory VarPtr(dirBuf), VarPtr(buf(pos)), Len(dirBuf)
               
                Debug.Print dirBuf.dwFileNameLength & " " & dirBuf.dwNextEntryOffset
               
                Select Case dirBuf.dwAction
                    Case FILE_ACTION_ADDED:
                        Debug.Print "Creaste ";
                    Case FILE_ACTION_MODIFIED:
                        Debug.Print "Modificaste ";
                    Case FILE_ACTION_REMOVED:
                        Debug.Print "Borraste ";
                    Case FILE_ACTION_RENAMED_NEW_NAME:
                        Debug.Print "Renombraste a ";
                    Case FILE_ACTION.FILE_ACTION_RENAMED_OLD_NAME:
                        Debug.Print "Nombre Anterior ";
                End Select
               
                bstr = dirBuf.wcFileName
                bstr = Left(bstr, dirBuf.dwFileNameLength / 2)
                Debug.Print bstr
            Wend
           
            'reseteamos y volvemos a empezar
            ResetEvent hEvent
            Call ReadDirectoryChangesW(hDir, VarPtr(buf(0)), UBound(buf) + 1, True, FILE_NOTIFY_CHANGE_FILE_NAME, nUsed, VarPtr(oLap), 0&)
        End If
        DoEvents
    Loop While Not fstop
   
    'Cerramos los Handles
    CloseHandle hEvent
    CloseHandle hDir
End Sub

Private Sub Command2_Click()
    'paramos el monitoreo
    fstop = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'empezamos el monitoreo
    fstop = True
End Sub


saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

musicaward

seba123neo.. en esa linea:

CitarhDir = CreateFile("C:\", FILE_LIST_DIRECTORY, FILE_SHARE_READ Or FILE_SHARE_DELETE Or FILE_SHARE

pondria ? C:\archivo.txt  o estoy equivocado... si es asi hazmelo saber gracias...por el gran codigo

Dessa

#8
Hola, lo que te indica seba está perfecto, pero con la funcion Dir en un timer (5000) no es suficiente ?

If Dir("C:\archivo.txt") <> "" Then Kill "C:\archivo.txt"

Saludos



Adrian Desanti

musicaward

gracias Dessa.. tu ayuda me funciono perfecto..... igual gracias a  seba123neo   pueden cerrar el tema .. si es que se puede  ::)