Yanıtlar:
1.) Burayı kontrol edin . Temel olarak şunu yapın:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
İhtiyaç duyulan çeşitli hata işlemeyi bulmanızı size bırakacağım, ancak bunlar, dikkate aldığım hata işleme konuları arasındadır:
2.) Dosya Nasıl Silinir. Şuna bak . Temelde Kill komutunu kullanın, ancak bir dosyanın salt okunur olma olasılığına izin vermeniz gerekir. İşte sizin için bir işlev:
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
Yine, hata işlemeyi size bırakacağım ve yine dikkate alacağım şeyler bunlar:
Bu bir dosya için bir dizin için farklı mı davranmalı? Bir kullanıcının bir dizini silmek istediğini açıkça belirtmesi gerekir mi?
Kodun salt okunur özniteliğini otomatik olarak sıfırlamasını mı istiyorsunuz yoksa kullanıcıya salt okunur özniteliğinin ayarlandığına dair bir tür gösterge verilmeli mi?
DÜZENLEME: Bu yanıtı topluluk wiki olarak işaretleyin, böylece gerekirse herkes değiştirebilir.
Brettski'nin cevabını kodlamanın, aksi takdirde tamamen kabul ettiğim alternatif bir yol olabilir.
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Aynı etki, ancak daha az (iyi, hiç yok) değişken bildirimi.
FileSystemObject gerçekten kullanışlı bir araçtır ve arkadaş olmaya değer. Her şeyden ayrı olarak, metin dosyası yazmak için aslında bazen eski alternatiften daha hızlı olabilir ve bu da birkaç kişiyi şaşırtabilir. (En azından benim deneyimime göre, YMMV).
Muhtemelen bunun için alevleneceğim, ama onu silecekseniz, varoluşu test etmenin amacı nedir? En büyük evcil hayvanımdan biri, "Dosya silinemedi, mevcut değil!" Gibi bir hata iletişim kutusu atan bir uygulama.
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.
Dosya ilk etapta mevcut değilse, görev tamamlandı!
ActiveWorkbook.SaveCopyAs
kullanımı üzerine yazamaz, bu nedenle önce aynı dosya adına sahip mevcut dosyayı kaldırmanız gerekir.
On Error Resume Next
, yoksa bana söylendi: D Elbette, bu saçma bir tavsiye ve cevabın doğru.
Len(dir(...))
Bölüm varlığını denetlemek için YALNIZCA değildir. Ayrıca bir dosya GİZLİ olup olmadığını kontrol gizli dosya varolduğundan bile boş bir dize döndürür çünkü (ve bunu silmek mümkün olmayacaktır): Dir(hiddenFile) = ""
. Dolayısıyla, kısım SetAttr FileToDelete, vbNormal
bunu sizin için anlamlı bir şekilde hallediyor.
Aşağıdakiler, bir dosyanın varlığını test etmek ve ardından onu silmek için kullanılabilir.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(ve LenB()
daha da hızlı olmasının) nedeni, bellekte VB dizgilerinin uzunluklarının önünde olmasıdır. Len / LenB sadece bu bellek konumundan uzunluğu çeker, uzunluğunu bilmek için dizeyi yinelemeleri gerekmez. Öte yandan, dizge karşılaştırmasını kullanmak daha yapılacak çok iş var. Ek ""
olarak, her zaman yeni bir dizge ayırdığı için VB'de kullanmaktan kaçının . Kullan vbNullString
o bir sabittir ve olmadığını daha fazla bellek kullanır yerine.
Scripting.Runtime kitaplığına bir başvuru ayarlayın ve ardından FileSystemObject öğesini kullanın:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
İşte bir ipucu: Dosya adını yeniden mi kullanıyorsunuz yoksa hemen silinmesini gerektiren bir şey mi yapmayı planlıyorsunuz?
Hayır?
VBA'yı kullanarak komut isteminden DEL "C: \ TEMP \ scratchpad.txt" / F komutunu eşzamansız olarak VBA kullanarak çalıştırması için VBA'yı alabilirsiniz.
Kabuk "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide
Dosya adının etrafındaki çift tırnak işaretlerine (ASCII karakteri 34) dikkat edin: Bir ağ yolunuz veya boşluklar içeren uzun bir dosya adınız olduğunu varsayıyorum.
Dosya büyükse veya ağ bağlantısı yavaşsa, ateş et ve unutmanın yolu budur. Elbette, bunun işe yarayıp yaramadığını asla göremezsiniz; ancak VBA'nızı hemen devam ettirirsiniz ve bunun ağı beklemekten daha iyi olduğu zamanlar vardır.
Scripting.Runtime kitaplığına bir başvuru ayarlayabilir ve ardından FileSystemObject öğesini kullanabilirsiniz. Bir DeleteFile yöntemi ve bir FileExists yöntemi vardır.
Buradaki MSDN makalesine bakın .