VBA에서 파일 삭제


121

VBA를 사용하여 다음을 수행 할 수 있습니다.

  1. 파일이 존재하는지 테스트하고 존재한다면
  2. 삭제 하시겠습니까?

답변:


168

1.) 여기에서 확인 하십시오 . 기본적으로 다음을 수행하십시오.

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

필요한 다양한 오류 처리를 알아 내기 위해 맡기겠습니다. 그러나 다음은 제가 고려하고있는 오류 처리 항목 중 하나입니다.

  • 빈 문자열이 전달되는지 확인하십시오.
  • 파일 이름 / 경로에 잘못된 문자가 포함 된 문자열을 확인하십시오.

2.) 파일 삭제 방법. 이것 좀 봐 . 기본적으로 Kill 명령을 사용하지만 파일이 읽기 전용 일 가능성을 허용해야합니다. 다음은 당신을위한 기능입니다.

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

다시 말하지만, 오류 처리는 여러분에게 맡기고 다음과 같은 사항을 고려해야합니다.

  • 디렉토리와 파일에 대해 다르게 동작해야합니까? 사용자가 디렉토리를 삭제할 것인지 명시 적으로 표시해야합니까?

  • 코드가 읽기 전용 속성을 자동으로 재설정하도록 하시겠습니까? 아니면 사용자에게 읽기 전용 속성이 설정되어 있다는 표시를 받아야합니까?


편집 :이 답변을 커뮤니티 위키로 표시하여 필요한 경우 누구나 수정할 수 있습니다.


감사합니다-만약 존재하는 동일한 이름의 파일이 두 개 있다면 DeleteFile 서브가 둘 다 죽이거나 하나만 죽일까요? 많은 조언을 부탁드립니다.
BKSpurgeon

6
디렉토리에 같은 이름을 가진 두 개의 파일을 가질 수 없습니다.
Onorio Catenacci

52

Brettski의 답변을 코딩하는 다른 방법은 내가 그렇지 않으면 완전히 동의하는 것입니다.

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

효과는 같지만 변수 선언은 적습니다.

FileSystemObject는 정말 유용한 도구이며 친숙해질 가치가 있습니다. 다른 것 외에도 텍스트 파일 작성의 경우 실제로 때로는 레거시 대안보다 빠를 수 있으며 이는 일부 사람들을 놀라게 할 수 있습니다. (내 경험으로는 적어도 YMMV).


7
파일 스크립트 객체를 선언하지 않고이 구문을 사용하여, 마이크로 소프트 런타임 스크립팅에 대한 참조를 추가해야합니다, 다른 : 희미한는 새로운 Scripting.FileSystemObject와 FS 혜택
pghcpa

5
스크립팅 라이브러리도 참조해야합니다. 여기 참조 : stackoverflow.com/questions/3233203/…
ekkis

Nothing으로 설정할 변수가 없기 때문에 FileSystemObject가 메모리에 남아 누수 또는 기타 문제를 일으킬 위험이 있습니까?
johny 왜

아니요, "End With"후에 폐기됩니다. 변수에 할당되지 않았기 때문에 효과는 "Nothing"으로 설정된 변수에 할당 된 개체와 유사합니다.
jony

15

나는 아마도 이것에 대해 화를 낼 것입니다. 그러나 당신이 그것을 삭제하려는 경우 존재 여부를 테스트하는 요점은 무엇입니까? 내 주요 애완 동물 중 하나는 "파일을 삭제할 수 없습니다. 존재하지 않습니다!"와 같은 오류 대화 상자를 표시하는 앱입니다.

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.

파일이 처음에 존재하지 않으면 임무 완수!


4
당신은 좋은 지적을했지만, 대부분의 것들과 마찬가지로 그것은 상황에 따라 달라질 것이라고 생각하며 때로는 단순히 "File Exists"기능을 갖는 것이 삭제와 별도로 편리합니다.
Onorio Catenacci

3
+1 : 응용 프로그램의 사용자가 파일을 제거하기 전에 질문을 받기를 원할 수 있습니다. 예를 들어를 사용 ActiveWorkbook.SaveCopyAs하면 덮어 쓸 수 없으므로 먼저 동일한 파일 이름을 가진 기존 파일을 제거해야합니다.
Joël 2013

그러나 당신은 절대를 사용해서는 안되며 On Error Resume Next, 그렇게 들었습니다. : D 물론, 그것은 어리석은 조언이며 귀하의 대답은 정확합니다.
Johny는 왜

Len(dir(...))부분은 존재를 확인하기위한 것이 아닙니다. 또한 숨겨진 파일이 존재하더라도 빈 문자열을 반환하기 때문에 파일이 HIDDEN인지 확인 합니다 (그리고 삭제할 수 없습니다) Dir(hiddenFile) = "". 따라서 그 부분 SetAttr FileToDelete, vbNormal은 당신을 위해 이것을 웅변 적으로 처리합니다.
elektrykalAJ

11

다음을 사용하여 파일의 존재 여부를 테스트 한 다음 삭제할 수 있습니다.

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

3
나는이 질문과 응답이 오래되었다는 것을 알고 있으며 Len ()을 사용하여 문자열 (및 문자열을 반환하는 함수)을 테스트하는 것이 VBA의 리터럴 문자열 비교보다 빠르다고 생각했습니다.
JimmyPena

7
Len()(및 LenB()더 빠름)이 문자열 비교보다 빠른 이유 는 메모리에서 VB 문자열 앞에 길이가 있기 때문입니다. Len / LenB는 해당 메모리 위치에서 길이를 가져 오므로 길이를 알기 위해 문자열을 반복 할 필요가 없습니다. 반면에 문자열 비교를 사용하면해야 할 일이 훨씬 더 많습니다. 또한 ""항상 새 문자열을 할당하므로 VB에서 사용하지 마십시오 . vbNullString상수이고 더 많은 메모리를 사용하지 않으므로 대신 사용하십시오 .
Renaud Bompuis 2014

7

VB에서는 일반적으로 Dir파일의 디렉토리를 찾습니다. 비어 있지 않으면 존재하고 Kill파일을 제거하는 데 사용합니다.

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

6

Scripting.Runtime 라이브러리에 대한 참조를 설정 한 다음 FileSystemObject를 사용합니다.

Dim fso as New FileSystemObject, aFile as File

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

킬 diacritis와 파일 / 폴더를 삭제할 수없는 것처럼 나도 FileSystemObject를 방법을 사용
mauek unak

이것은 내가 사용하는 방법입니다. 이것을 구현하는 사람은 오류 검사 및 DisplayAlerts = false를 사용하고 싶어합니다. (이 파일은 사용의 경우는 삭제되지 않습니다 때문에 오류 트랩이 있어야합니다)
그레그 번스

3

여기에 팁이 있습니다. 파일 이름을 재사용하고 있습니까? 아니면 즉시 삭제해야하는 작업을 수행 할 계획입니까?

아니?

VBA.Shell을 사용하여 명령 프롬프트에서 DEL "C : \ TEMP \ scratchpad.txt"/ F 명령을 비동기 적으로 실행하도록 VBA를 가져올 수 있습니다 .

쉘 "DEL"& chr (34) & strPath & chr (34) & "/ F", vbHide

파일 이름 주위에 큰 따옴표 (ASCII 문자 34)가 있습니다. 네트워크 경로가 있거나 공백이 포함 된 긴 파일 이름이 있다고 가정합니다.

파일이 크거나 네트워크 연결이 느린 경우에는 즉시 실행을 중지하는 것이 좋습니다. 물론 이것이 효과가 있는지 여부를 결코 알 수 없습니다. 그러나 VBA를 즉시 다시 시작하고 이것이 네트워크를 기다리는 것보다 나은 경우가 있습니다.


비동기가 원하는 경우 이것은 훌륭한 대안 입니다.
johny 왜

2

Scripting.Runtime 라이브러리에 대한 참조를 설정 한 다음 FileSystemObject를 사용할 수 있습니다. DeleteFile 메서드와 FileExists 메서드가 있습니다.

여기 에서 MSDN 문서를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.