VBA में एक फ़ाइल हटाना


121

VBA का उपयोग करके, मैं कैसे कर सकता हूं:

  1. परीक्षण करें कि क्या कोई फ़ाइल मौजूद है, और यदि है, तो
  2. इसे मिटाओ?

जवाबों:


168

1.) यहां देखें । मूल रूप से ऐसा करें:

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

मैं आपको विभिन्न त्रुटि से निपटने के लिए यह पता लगाने के लिए छोड़ दूंगा लेकिन ये उन चीजों को संभालने में त्रुटि के बीच हैं जिन पर मैं विचार कर रहा हूं:

  • खाली स्ट्रिंग की जाँच की जा रही है।
  • फ़ाइल नाम / पथ में अवैध रूप से वर्ण वाले स्ट्रिंग की जाँच करें

2.) किसी फाइल को कैसे डिलीट करें। इसे देखो मूल रूप से किल कमांड का उपयोग करें, लेकिन आपको केवल-पढ़ने के लिए फ़ाइल की संभावना के लिए अनुमति देने की आवश्यकता है। यहाँ आप के लिए एक समारोह है:

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
आपके पास निर्देशिका में समान नाम वाली दो फाइलें नहीं हो सकती हैं।
ओनोरियो कैटेनेशिआ

52

ब्रेटस्की के उत्तर को कोड करने का एक वैकल्पिक तरीका, जिसके साथ मैं अन्यथा पूरी तरह सहमत हूं, हो सकता है

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

समान प्रभाव लेकिन कम (अच्छी तरह से, कोई भी नहीं) चर घोषणाएं।

FileSystemObject एक बहुत ही उपयोगी उपकरण है और इसके साथ अनुकूल होने के लायक है। कुछ और के अलावा, पाठ फ़ाइल लेखन के लिए यह वास्तव में कभी-कभी विरासत विकल्प से तेज हो सकता है, जो कुछ लोगों को आश्चर्यचकित कर सकता है। (मेरे अनुभव में कम से कम, YMMV)।


7
फ़ाइल स्क्रिप्टिंग ऑब्जेक्ट घोषित किए बिना इस सिंटैक्स का उपयोग करना, Microsoft स्क्रिप्टिंग रनटाइम के लिए संदर्भ जोड़ना चाहिए, और: नई स्क्रिप्टिंग के रूप में डिम fs
.ileSystemObject

5
आपको स्क्रिप्टिंग लाइब्रेरी का संदर्भ भी देना होगा। यहाँ देखें: stackoverflow.com/questions/3233203/…
ekkis

चूँकि कुछ भी करने के लिए सेट करने के लिए कोई चर नहीं है, क्या कोई जोखिम है FileSystemObject स्मृति में बना रहेगा, जिससे रिसाव या अन्य समस्या हो सकती है?
जॉनी क्यों

नहीं, इसे "एंड विथ" के बाद छोड़ दिया जाएगा। चूंकि यह एक चर को नहीं सौंपा गया है, इसलिए प्रभाव उस वस्तु के समान है जिसे एक चर में सौंपा गया है जिसे "कुछ भी नहीं" पर सेट किया गया है।
जॉनी

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
आप एक अच्छी बात उठाते हैं, लेकिन ज्यादातर चीजों की तरह, मुझे लगता है कि यह संदर्भ पर निर्भर करेगा और कभी-कभी "फ़ाइल एक्ज़िस्ट" फ़ंक्शन को हटाने के अलावा आसान होता है।
ओनोरियो कैटेनेशिया

3
+1: हो सकता है कि एप्लिकेशन का उपयोगकर्ता किसी फ़ाइल को हटाने से पहले पूछना चाहता हो: उदाहरण के लिए, उपयोग ActiveWorkbook.SaveCopyAsकरना अधिलेखित करने में सक्षम नहीं है, इसलिए आपको पहले फ़ाइल नाम के साथ मौजूदा फ़ाइल को निकालना होगा।
जोएल

लेकिन आपको कभी भी उपयोग नहीं करना चाहिए On Error Resume Next, या इसलिए मुझे बताया गया है: निश्चित रूप से, यह हास्यास्पद सलाह है, और आपका उत्तर सही है।
जॉनी क्यों

Len(dir(...))भाग में केवल होने की जाँच करने के लिए नहीं है। यह भी जाँच रहा है कि क्या फ़ाइल छिपाई गई है क्योंकि एक छिपी हुई फ़ाइल मौजूद होने पर भी एक खाली स्ट्रिंग वापस आ जाएगी (और आप इसे हटा नहीं पाएंगे) 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
मुझे पता है कि यह सवाल और प्रतिक्रिया पुरानी है, बस मैंने सोचा था कि मैं स्ट्रिंग्स (और फ़ंक्शंस जो रिटर्निंग स्ट्रिंग्स) का उपयोग करने के लिए वीएबीए में शाब्दिक स्ट्रिंग तुलनाओं की तुलना में अधिक तेज़ हो।
जिम्मीना नोवा

7
कारण यह है कि Len()(और LenB(), जो कि और भी तेज है) स्ट्रिंग तुलना की तुलना में तेज है स्मृति में, वीबी स्ट्रिंग्स उनकी लंबाई से पहले हैं। लेन / लेनब सिर्फ उस स्मृति स्थान से लंबाई खींचते हैं, उन्हें इसकी लंबाई जानने के लिए स्ट्रिंग के माध्यम से पुनरावृति नहीं करना पड़ता है। दूसरी ओर, स्ट्रिंग तुलना का उपयोग करने के लिए बहुत अधिक काम करना है। इसके अतिरिक्त, ""VB में उपयोग करने से बचें क्योंकि यह हमेशा एक नया स्ट्रिंग आवंटित करता है। vbNullStringइसके बजाय उपयोग करें क्योंकि यह एक स्थिर है और अधिक मेमोरी का उपयोग नहीं करता है।
रेनॉड बंपसुवे

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


यह वह विधि है जिसका मैं उपयोग करता हूं .. कोई व्यक्ति जो इसे लागू करता है वह त्रुटि जाँच और DisplayAlerts = false का उपयोग करना चाहता है। (यदि यह उपयोग में है तो फाइल डिलीट नहीं होगी, इसलिए इसमें एरर ट्रैप होना चाहिए)
ग्रेग बर्न्स

3

यहां एक टिप दी गई है: क्या आप फ़ाइल नाम का फिर से उपयोग कर रहे हैं, या कुछ ऐसा करने की योजना बना रहे हैं जिसे तुरंत हटाने की आवश्यकता है?

नहीं?

आप कमांड को आग लगाने के लिए VBA प्राप्त कर सकते हैं DEL "C: \ TEMP \ scratchpad.txt" / F कमांड प्रॉम्प्ट से asynchronously का उपयोग करके VBA.Shell:

शैल "DEL" और chr (34) और strPath और chr (34) और "/ F", vbHide

फ़ाइल नाम के आस-पास डबल-कोट्स (ASCII वर्ण 34) पर ध्यान दें: मैं मान रहा हूं कि आपको एक नेटवर्क पथ या रिक्त स्थान वाला एक लंबा फ़ाइल नाम मिला है।

यदि यह एक बड़ी फ़ाइल है, या यह एक धीमे नेटवर्क कनेक्शन पर है, तो आग-और-भूल जाने का रास्ता है। बेशक, आपको यह देखने के लिए कभी नहीं मिलेगा कि यह काम किया है या नहीं; लेकिन आप तुरंत अपने VBA को फिर से शुरू करते हैं, और ऐसे समय होते हैं जब यह नेटवर्क के लिए इंतजार करने से बेहतर है।


यह एक बढ़िया विकल्प है, अगर एसिंच वही है जो आप चाहते हैं।
जॉनी क्यों

2

आप Scripting.Runtime लाइब्रेरी का संदर्भ सेट कर सकते हैं और फिर FileSystemObject का उपयोग कर सकते हैं। इसमें एक DeleteFile विधि और एक FileExists विधि है।

MSDN लेख यहाँ देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.