VBA'da bir dosyayı silme


Yanıtlar:


168

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:

  • Geçilen boş bir dizge olup olmadığını kontrol edin.
  • Dosya adı / yolunda geçersiz karakterler içeren bir dizge olup olmadığını kontrol edin

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.


teşekkür ederim - ya aynı isimde iki dosya varsa, DeleteFile alt dosyası ikisini de mi yoksa sadece birini mi öldürür? herhangi bir tavsiye çok takdir.
BKSpurgeon 01

6
Bir dizinde aynı ada sahip iki dosyanız olamaz.
Onorio Catenacci

53

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).


7
Bir dosya komut dosyası oluşturma nesnesi bildirmeden bu sözdizimini kullanmak, Microsoft Scripting Runtime için referans eklemelidir, aksi takdirde: Dim fs As New Scripting.FileSystemObject
pghcpa

5
ayrıca komut dosyası kitaplığına başvurmanız gerekir. buraya bakın: stackoverflow.com/questions/3233203/…
ekkis

Nothing olarak ayarlanacak bir değişken olmadığından, FileSystemObject öğesinin bellekte kalarak sızıntıya veya başka bir soruna neden olma riski var mı?
johny why

Hayır, "Sonlandır" seçeneğinden sonra silinecektir. Bir değişkene atanmadığından, efekt "Hiçbir şey" olarak ayarlanmış bir değişkene atanmış olan nesneye benzer.
jony

15

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ı!


4
İyi bir noktayı ortaya koyuyorsunuz, ancak çoğu şey gibi, bunun bağlama bağlı olacağını düşünüyorum ve bazen basitçe bir "Dosya Var" işlevine sahip olmak, silme işleminin dışında kullanışlıdır.
Onorio Catenacci

3
+1: belki uygulamanın kullanıcısı bir dosyayı kaldırmadan önce sorulmasını ister: örneğin, ActiveWorkbook.SaveCopyAskullanımı üzerine yazamaz, bu nedenle önce aynı dosya adına sahip mevcut dosyayı kaldırmanız gerekir.
Joël

ama asla kullanmamalısın On Error Resume Next, yoksa bana söylendi: D Elbette, bu saçma bir tavsiye ve cevabın doğru.
johny why

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, vbNormalbunu sizin için anlamlı bir şekilde hallediyor.
elektrykalAJ

11

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 

3
Bu sorunun ve yanıtın eski olduğunu biliyorum, sadece dizeleri (ve dizeleri döndüren işlevleri) test etmek için Len () kullanmanın VBA'daki değişmez dize karşılaştırmalarından daha hızlı olduğunu eklemeyi düşündüm.
JimmyPena

7
Dize karşılaştırmasından daha hızlı olmasının 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 vbNullStringo bir sabittir ve olmadığını daha fazla bellek kullanır yerine.
Renaud Bompuis

7

VB'de normalde Dirdosyanın dizinini bulmaktır. Boş değilse, var olur ve ardından Killdosyadan kurtulmak için kullanın .

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

6

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

Kill, aksanlı dosya / klasörleri silemediği için FileSystemObject yöntemini de kullanıyorum
mauek unak

Benim kullandığım yöntem bu .. Bunu uygulayan biri hata denetimi kullanmak istiyor ve DisplayAlerts = false. (Dosya kullanımdaysa
Gregg Burns

3

İş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.


Asenkron istediğiniz şey buysa , bu harika bir alternatiftir .
johny why

2

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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.