답변:
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
다시 말하지만, 오류 처리는 여러분에게 맡기고 다음과 같은 사항을 고려해야합니다.
디렉토리와 파일에 대해 다르게 동작해야합니까? 사용자가 디렉토리를 삭제할 것인지 명시 적으로 표시해야합니까?
코드가 읽기 전용 속성을 자동으로 재설정하도록 하시겠습니까? 아니면 사용자에게 읽기 전용 속성이 설정되어 있다는 표시를 받아야합니까?
편집 :이 답변을 커뮤니티 위키로 표시하여 필요한 경우 누구나 수정할 수 있습니다.
Brettski의 답변을 코딩하는 다른 방법은 내가 그렇지 않으면 완전히 동의하는 것입니다.
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
효과는 같지만 변수 선언은 적습니다.
FileSystemObject는 정말 유용한 도구이며 친숙해질 가치가 있습니다. 다른 것 외에도 텍스트 파일 작성의 경우 실제로 때로는 레거시 대안보다 빠를 수 있으며 이는 일부 사람들을 놀라게 할 수 있습니다. (내 경험으로는 적어도 YMMV).
나는 아마도 이것에 대해 화를 낼 것입니다. 그러나 당신이 그것을 삭제하려는 경우 존재 여부를 테스트하는 요점은 무엇입니까? 내 주요 애완 동물 중 하나는 "파일을 삭제할 수 없습니다. 존재하지 않습니다!"와 같은 오류 대화 상자를 표시하는 앱입니다.
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.
파일이 처음에 존재하지 않으면 임무 완수!
ActiveWorkbook.SaveCopyAs
하면 덮어 쓸 수 없으므로 먼저 동일한 파일 이름을 가진 기존 파일을 제거해야합니다.
On Error Resume Next
, 그렇게 들었습니다. : D 물론, 그것은 어리석은 조언이며 귀하의 대답은 정확합니다.
Len(dir(...))
부분은 존재를 확인하기위한 것이 아닙니다. 또한 숨겨진 파일이 존재하더라도 빈 문자열을 반환하기 때문에 파일이 HIDDEN인지 확인 합니다 (그리고 삭제할 수 없습니다) Dir(hiddenFile) = ""
. 따라서 그 부분 SetAttr FileToDelete, vbNormal
은 당신을 위해 이것을 웅변 적으로 처리합니다.
다음을 사용하여 파일의 존재 여부를 테스트 한 다음 삭제할 수 있습니다.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(및 LenB()
더 빠름)이 문자열 비교보다 빠른 이유 는 메모리에서 VB 문자열 앞에 길이가 있기 때문입니다. Len / LenB는 해당 메모리 위치에서 길이를 가져 오므로 길이를 알기 위해 문자열을 반복 할 필요가 없습니다. 반면에 문자열 비교를 사용하면해야 할 일이 훨씬 더 많습니다. 또한 ""
항상 새 문자열을 할당하므로 VB에서 사용하지 마십시오 . vbNullString
상수이고 더 많은 메모리를 사용하지 않으므로 대신 사용하십시오 .
Scripting.Runtime 라이브러리에 대한 참조를 설정 한 다음 FileSystemObject를 사용합니다.
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
여기에 팁이 있습니다. 파일 이름을 재사용하고 있습니까? 아니면 즉시 삭제해야하는 작업을 수행 할 계획입니까?
아니?
VBA.Shell을 사용하여 명령 프롬프트에서 DEL "C : \ TEMP \ scratchpad.txt"/ F 명령을 비동기 적으로 실행하도록 VBA를 가져올 수 있습니다 .
쉘 "DEL"& chr (34) & strPath & chr (34) & "/ F", vbHide
파일 이름 주위에 큰 따옴표 (ASCII 문자 34)가 있습니다. 네트워크 경로가 있거나 공백이 포함 된 긴 파일 이름이 있다고 가정합니다.
파일이 크거나 네트워크 연결이 느린 경우에는 즉시 실행을 중지하는 것이 좋습니다. 물론 이것이 효과가 있는지 여부를 결코 알 수 없습니다. 그러나 VBA를 즉시 다시 시작하고 이것이 네트워크를 기다리는 것보다 나은 경우가 있습니다.