2008-09-15 20 views

Respuesta

124

1.) Compruebe here. Básicamente hacer esto:

Function FileExists(ByVal FileToTest As String) As Boolean 
    FileExists = (Dir(FileToTest) <> "") 
End Function 

Lo dejo a usted para averiguar los distintos gestión de errores es necesario, pero estas son algunas de las cosas de tratamiento de errores que estaría considerando:

  • Comprobar si hay una vacía cadena que se pasa.
  • Compruebe si hay una cadena que contiene caracteres no válidos en un nombre de archivo/path

2.) ¿Cómo borrar un archivo. Mire this. Básicamente use el comando Kill pero necesita permitir la posibilidad de que un archivo sea de solo lectura. Esto es una función para usted:

Sub DeleteFile(ByVal FileToDelete As String) 
    If FileExists(FileToDelete) Then 'See above   
     ' First remove readonly attribute, if set 
     SetAttr FileToDelete, vbNormal   
     ' Then delete the file 
     Kill FileToDelete 
    End If 
End Sub 

Una vez más, voy a dejar el manejo de errores a que una y otra vez estas son las cosas que yo consideraría:

  • Si esto comportarse de manera diferente para un directorio vs . ¿un archivo? ¿Debería un usuario tener que indicar explícitamente que quiere eliminar un directorio?

  • ¿Desea que el código restablezca automáticamente el atributo de solo lectura o debería darse al usuario algún tipo de indicación de que está configurado el atributo de solo lectura?


EDIT: Marcado esta respuesta como wiki de la comunidad por lo que cualquiera puede modificarlo si es necesario.

+0

gracias, ¿qué pasa si hay dos archivos con el mismo nombre que existirán si el subproceso DeleteFile los mata a ambos o solo a uno? cualquier consejo muy apreciado. – BKSpurgeon

+6

No puede tener dos archivos con el mismo nombre en un directorio. –

+0

brillante por supuesto! – BKSpurgeon

6

En VB es normalmente Dir para encontrar el directorio del archivo. Si no está en blanco, entonces existe y luego use Kill para deshacerse del archivo.

test = Dir(Filename) 
If Not test = "" Then 
    Kill (Filename) 
End If 
9

Lo siguiente se puede utilizar para probar la existencia de un archivo y luego para eliminarlo.

Dim aFile As String 
aFile = "c:\file_to_delete.txt" 
If Len(Dir$(aFile)) > 0 Then 
    Kill aFile 
End If 
+3

Sé que esta pregunta y respuesta son antiguas, simplemente pensé que agregaría que usar Len() para probar cadenas (y funciones que devuelven cadenas) parece ser más rápido que las comparaciones de cadenas literales en VBA. – JimmyPena

+5

La razón por la cual 'Len()' (y 'LenB()', que es aún más rápido) son más rápidos que la comparación de cadenas es que en la memoria, las cadenas de VB están precedidas por su longitud. Len/LenB simplemente extraen la longitud de esa ubicación de memoria, no tienen que iterar a través de la cadena para conocer su longitud. Por otro lado, el uso de la comparación de cadenas tiene mucho más trabajo por hacer. Además, evite usar '" "' en VB ya que siempre asigna una nueva cadena. Use 'vbNullString' en su lugar ya que es una constante y no usa más memoria. –

2

Puede establecer una referencia a la biblioteca Scripting.Runtime y luego usar FileSystemObject. Tiene un método DeleteFile y un método FileExists.

Consulte el artículo de MSDN here.

10

Probablemente me llame la atención por esto, pero ¿de qué sirve probar si solo quieres borrarlo? Una de mis principales preocupaciones es una aplicación que arroja un cuadro de diálogo de error con algo así como "No se pudo eliminar el archivo, ¡no existe!"

On Error Resume Next 
aFile = "c:\file_to_delete.txt" 
Kill aFile 
On Error Goto 0 
return Len(Dir$(aFile)) > 0 ' Make sure it actually got deleted. 

Si el archivo no existe en primer lugar, ¡misión cumplida!

+3

Usted plantea un buen punto, pero, como la mayoría de las cosas, creo que dependerá del contexto y, a veces, simplemente tiene una función de "archivo existente" aparte de la eliminación. –

+2

+1: tal vez el usuario de la aplicación quiera que se le pregunte antes de eliminar un archivo: por ejemplo, al usar 'ActiveWorkbook.SaveCopyAs' no se puede sobrescribir, por lo que primero debe eliminar el archivo existente con el mismo nombre de archivo. –

+0

pero nunca debe usar 'On Resume Resume Next', o eso me han dicho: D Por supuesto, eso es un consejo ridículo, y su respuesta es correcta. –

4

establecer una referencia a la biblioteca Scripting.Runtime y luego utilizar el FileSystemObject:

Dim fso as New FileSystemObject, aFile as File 

if (fso.FileExists("PathToFile")) then 
    aFile = fso.GetFile("PathToFile") 
    aFile.Delete 
End if 
+0

Utilizo el método FileSystemObject también, ya que Kill no puede eliminar archivos/carpetas con diacritis –

39

Una forma alternativa de codificar la respuesta de Brettski, con la que de otro modo totalmente de acuerdo, podría ser

With New FileSystemObject 
    If .FileExists(yourFilePath) Then 
     .DeleteFile yourFilepath 
    End If 
End With 

Mismo efecto pero menos (bueno, nada en absoluto) declaraciones variables.

FileSystemObject es una herramienta realmente útil y vale la pena familiarizarse con ella. Aparte de todo lo demás, para la escritura de archivos de texto en realidad puede ser más rápido que la alternativa heredada, lo que puede sorprender a algunas personas. (En mi experiencia al menos, YMMV).

+5

Usando esta sintaxis sin declarar un objeto de creación de scripts de archivos, debe agregar referencia para Microsoft Scripting Runtime, else: Dim fs As New Scripting.FileSystemObject – pghcpa

+2

también necesita hacer referencia a la biblioteca de scripts. ver aquí: http://stackoverflow.com/questions/3233203/how-do-i-use-filesystemobject-in-vba – ekkis

+0

Dado que no hay ninguna variable para establecer en Nothing, ¿existe un riesgo de que FileSystemObject permanezca en la memoria, causando una fuga u otro problema? –

3

Aquí hay un consejo: ¿está volviendo a utilizar el nombre del archivo, o está planeando hacer algo que requiere la eliminación de inmediato?

¿No?

Puede obtener VBA para disparar el comando DEL "C: \ TEMP \ scratchpad.txt"/F de la línea de comandos de forma asíncrona usando VBA.Shell:

Shell "DEL" & CHR (34) & strPath & CHR (34) & "/ F", vbHide

Nota las comillas dobles (caracteres ASCII 34) alrededor del nombre de archivo: Asumo que tienes una ruta de red, o una larga nombre de archivo que contiene espacios.

Si se trata de un archivo grande o de una conexión de red lenta, ignórelo es el camino a seguir. Por supuesto, nunca se puede ver si esto funcionó o no; pero reanuda su VBA inmediatamente, y hay momentos en que esto es mejor que esperar a la red.

+0

Esta es una gran alternativa, * si * asynch es lo que quieres. –

Cuestiones relacionadas