2012-07-02 6 views
7

क्या यह सत्यापित करने के लिए कोई तरीका है कि फ़ाइल खुलती है? एकमात्र चीज जो मैं सोच सकता हूं वह Try/Catch है यह देखने के लिए कि क्या मैं फ़ाइल-ओपन अपवाद पकड़ सकता हूं लेकिन मुझे लगा कि फ़ाइल खुली होने पर सही/गलत लौटने के लिए एक विधि उपलब्ध हो सकती है।वीबी.नेट एक जांच/लिखने के साथ आगे बढ़ने से पहले फ़ाइल खोलने पर जांच कर रहा है?

वर्तमान में System.IO का उपयोग कर रहे हैं और Wallet नामक कक्षा के तहत निम्नलिखित कोड का उपयोग कर रहे हैं।

Private holdPath As String = "defaultLog.txt" 
    Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite) 
    Private file As New StreamWriter(_file) 

    Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal 
     Try 
      file.WriteLine("testing") 
      file.Close() 
     Catch e As IOException 
      'Note sure if this is the proper way. 
     End Try 

     Return 0D 
    End Function 

किसी भी पॉइंटर्स की सराहना की जाएगी! धन्यवाद!!

+0

फ़ाइल से निपटने। GETLastAccessTime() शायद? –

+1

फ़ाइल खोले जाने का कोई प्रत्यक्ष तरीका नहीं है। – coder

+1

मैंने यही पूछा है http://stackoverflow.com/questions/6706312/how-to-check-if-the-text-file-is-open-and-close-the-text-file और उत्तर मिला – coder

उत्तर

14
Private Sub IsFileOpen(ByVal file As FileInfo) 
    Dim stream As FileStream = Nothing 
    Try 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
     stream.Close() 
    Catch ex As Exception 

     If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then 
      ' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data 
     End If 
    End Try 
End Sub 

Private Shared Function IsFileLocked(exception As Exception) As Boolean 
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1) 
    Return errorCode = 32 OrElse errorCode = 33 
End Function 
+2

ग्रेट समाधान। मैं बस इतना जोड़ूंगा कि आपको कोई अपवाद नहीं होने पर stream.close() को सुनिश्चित करने की आवश्यकता है, इसलिए प्रोग्राम बिना किसी समस्या के जारी रख सकता है। – mlerley

+0

यह कहता है कि मार्शल घोषित नहीं किया गया है। –

+2

@CaryBondoc 'आयात प्रणाली। रनटाइम। इंटररोप सर्विसेज; * मार्शल को ठीक करने के लिए * मुद्दा घोषित नहीं किया गया है। ** युक्ति: ** 'मार्शल' में नीली छोटी रेखांकन होगी, इस पर माउस को घुमाएं और इससे आपको संकेत मिलेगा कि क्या गलत है! –

1

ऐसा लगता है कि इस MSDN forum posting से दो सुझावों में दोनों फ़ाइल खोलने की कोशिश कर रहे हैं।

पहला ऐसा है जो आप अभी कर रहे हैं, और दूसरा विंडोज एपीआई फ़ंक्शन (CreateFile) का उपयोग करना और फ़ाइल को इंगित करने वाले अमान्य हैंडल की जांच करना शामिल है। दोनों मामलों में वे यह निर्धारित करने के लिए एक त्रुटि स्थिति पर निर्भर हैं कि फ़ाइल खुली है या नहीं। संक्षेप में, मेरी राय में आप जिस विधि का उपयोग कर रहे हैं वह सही है क्योंकि एक System.IO.File.IsOpen संपत्ति नहीं है।

+1

हाय मार्क, मुझे यकीन है कि आपको पता है कि यह स्टैक ओवरव्लो में कस्टम है, जिसमें किसी लिंक की सामग्री का सारांश शामिल है या हाइलाइट्स जो विशेष रूप से प्रश्न का उत्तर देते हैं। आने वाले सालों के लिए एसई साइटों का लक्ष्य ज्ञान, ज्ञान का संसाधन बनना है। केवल एक लिंक के जवाब के साथ, ऑप को किसी ऐसे संसाधन का पता लगाने के लिए किसी अन्य संसाधन के माध्यम से खोदना चाहिए जिसके बारे में वह निश्चित नहीं हो सकता है। सबसे महत्वपूर्ण बात यह है कि यदि आपका लिंक कभी भी टूटना था, तो भविष्य में इस पृष्ठ पर आने वाले किसी भी व्यक्ति के लिए आपका उत्तर बेकार है। लिंक के लिए चीयर्स! –

+1

@ जेरेमी थॉम्पसन मुझे इसके बारे में पता है और मैं करता हूं। इस मामले में मैंने ** ** जागरूक ** निर्णय किसी भी कोड में चिपकाने का निर्णय नहीं लिया। मैं यह सुझाव देने की कोशिश नहीं कर रहा था कि यह जाने का सही तरीका था। मैं ** ओपी को आश्वस्त करने की कोशिश कर रहा था कि वह जिस तरह से कर रहा था वह सही था, आईएमएचओ। सुझाव है कि वह WinApi का उपयोग नहीं कर रहा था जो मैं करने की कोशिश कर रहा था और इस मामले में overkill। –

+1

धन्यवाद मार्क, मैं आपके उत्तर की सराहना करता हूं और मैं मानता हूं कि यह अधिक है लेकिन इसने मुझे इस विषय पर एक अच्छा दृष्टिकोण दिया है! धन्यवाद फिर से :) – Dayan

5

वास्तव में समारोह के लिए एक 'उपयोग की जांच में फ़ाइल है' का उपयोग कर जब से तुम अब भी इसलिए कि फ़ाइल को खोलने में विफल रहता है संभाल करने के लिए कोशिश पकड़ की आवश्यकता होगी कोई मतलब नहीं है। खुली फ़ाइल पहले से ही खुले होने की तुलना में कई और कारणों से विफल हो सकती है।

चेक करने के लिए एक फ़ंक्शन का उपयोग करना सफलता की कोई गारंटी नहीं है। 'उपयोग में फ़ाइल है चेक' केवल फाइल के लिए झूठी वापसी हो सकती है, जो पहले से ही खुली त्रुटि वाली फाइल के साथ विफल होने के लिए खुली है, क्योंकि चेक के बीच समय और फ़ाइल खोलने की कोशिश में यह किसी और द्वारा खोला गया था।

+1

वास्तव में उत्तर के बजाय टिप्पणी होना चाहिए – TruthOf42

संबंधित मुद्दे