2012-09-06 14 views
5

मैं नेटवर्क पर कुछ फ़ाइलों को अद्यतन करने के लिए एक वीबी स्क्रिप्ट लिख रहा हूं। शुरुआत से पहले, मैं जानना चाहता हूं कि इनमें से कोई भी फाइल लॉक है या नहीं। मैं से पहले यह करना चाहता हूं कि मैं वास्तव में कोई अपडेट करता हूं।मैं कैसे निर्धारित कर सकता हूं कि वीबीएस का उपयोग कर एक फाइल लॉक है या नहीं?

मुझे पता है कि मैं त्रुटि फ़ाइल जब मैं इसे बदलने का प्रयास अवरोधित किया गया है, तो संभाल कर सकते हैं, लेकिन मैं सच में जानना चाहते हैं कि किसी भी फाइल इससे पहले कि मैं किसी भी फाइल को अपडेट करें बंद हैं चाहता हूँ।

क्या यह देखने का कोई तरीका है कि वीबीएस (इसे बदलने की कोशिश करने के अलावा) का उपयोग करके फ़ाइल लॉक है?

उत्तर

11

यह फ़ंक्शन निर्धारित करता है कि 'लेखन' मोड में रुचि की फ़ाइल तक पहुंचा जा सकता है या नहीं। यह एक प्रक्रिया द्वारा लॉक किया गया है या नहीं यह निर्धारित करने के समान बिल्कुल नहीं है। फिर भी, आप पाते हैं कि यह आपकी स्थिति के लिए काम करता है। (कम से कम जब तक कुछ बेहतर साथ आता है।)

इस समारोह का संकेत देगा कि 'लिखने की पहुँच जब एक फ़ाइल अन्य प्रक्रिया द्वारा अवरोधित किया गया है संभव नहीं है। हालांकि, यह उस स्थिति को अन्य स्थितियों से अलग नहीं कर सकता जो 'लेखन' पहुंच को रोकती है। उदाहरण के लिए, 'लिखना' पहुंच भी संभव नहीं है यदि किसी फ़ाइल में केवल पढ़ने के लिए बिट सेट है या इसमें प्रतिबंधित एनटीएफएस अनुमतियां हैं। जब इन 'लेखन' पहुंच प्रयास किए जाते हैं तो इन सभी स्थितियों के परिणामस्वरूप 'अनुमति अस्वीकृत' होगी।

भी ध्यान रखें कि यदि फ़ाइल को अन्य प्रक्रिया द्वारा अवरोधित किया गया है, इस सवाल का जवाब इस समारोह से वापस लौटे ही पल समारोह निष्पादित किया जाता है पर विश्वसनीय है। तो, समवर्ती समस्याएं संभव हैं।

एक अपवाद अगर इन शर्तों के किसी भी पाए जाते हैं फेंक दिया जाता है: 'फ़ाइल नहीं मिला', 'पथ नहीं मिला', या 'अवैध फ़ाइल नाम' ('बुरा फ़ाइल नाम या नंबर')।

Function IsWriteAccessible(sFilePath) 
    ' Strategy: Attempt to open the specified file in 'append' mode. 
    ' Does not appear to change the 'modified' date on the file. 
    ' Works with binary files as well as text files. 

    ' Only 'ForAppending' is needed here. Define these constants 
    ' outside of this function if you need them elsewhere in 
    ' your source file. 
    Const ForReading = 1, ForWriting = 2, ForAppending = 8 

    IsWriteAccessible = False 

    Dim oFso : Set oFso = CreateObject("Scripting.FileSystemObject") 

    On Error Resume Next 

    Dim nErr : nErr = 0 
    Dim sDesc : sDesc = "" 
    Dim oFile : Set oFile = oFso.OpenTextFile(sFilePath, ForAppending) 
    If Err.Number = 0 Then 
     oFile.Close 
     If Err Then 
      nErr = Err.Number 
      sDesc = Err.Description 
     Else 
      IsWriteAccessible = True 
     End if 
    Else 
     Select Case Err.Number 
      Case 70 
       ' Permission denied because: 
       ' - file is open by another process 
       ' - read-only bit is set on file, *or* 
       ' - NTFS Access Control List settings (ACLs) on file 
       ' prevents access 

      Case Else 
       ' 52 - Bad file name or number 
       ' 53 - File not found 
       ' 76 - Path not found 

       nErr = Err.Number 
       sDesc = Err.Description 
     End Select 
    End If 

    ' The following two statements are superfluous. The VB6 garbage 
    ' collector will free 'oFile' and 'oFso' when this function completes 
    ' and they go out of scope. See Eric Lippert's article for more: 
    ' http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to-set-objects-to-nothing.aspx 

    'Set oFile = Nothing 
    'Set oFso = Nothing 

    On Error GoTo 0 

    If nErr Then 
     Err.Raise nErr, , sDesc 
    End If 
End Function 
+1

डैरिन नोट (अन्य जवाब में) है कि इस मॉड्यूल शामिल करना चाहिए: 'कॉन्स्ट ForReading = 1, ForWriting = 2, ForAppending = 8' – Smandoli

+0

@Smandoli - मेरा ध्यान करने के लिए इस चूक लाने के लिए धन्यवाद। मैंने तदनुसार कोड अपडेट किया है। यह भी ध्यान रखें मेरी टिप्पणी समारोह के अंत में स्थापित करने 'Nothing' को' oFile' और 'oFso' पूर्ववर्ती। – DavidRR

2

उदाहरण महान काम करता है लेकिन निम्नलिखित की जरूरत है वरना आप गलती 5 (अवैध प्रक्रिया) प्राप्त

Const ForReading = 1, ForWriting = 2, ForAppending = 8 
+1

यह डेविडआरआर द्वारा दिए गए उत्तर पर लागू होता प्रतीत होता है। मुझे सही लग रहा है। – Smandoli

3

स्क्रिप्ट नीचे 30 सेकंड के लिए एक फ़ाइल पर लिखने की कोशिश करता है और उसके बाद देता है। मुझे इसकी आवश्यकता थी जब हमारे सभी उपयोगकर्ताओं को एक स्क्रिप्ट पर क्लिक करना पड़ा। संभावना है कि एकाधिक उपयोगकर्ता एक ही समय में लिखने की कोशिश करते हैं। OpenCSV() फ़ाइल को 30 सेकंड के बीच में 1 सेकंड की देरी के साथ खोलने का प्रयास करता है।

Const ForAppending = 8 

    currentDate = Year(Now) & "-" & Month(Now) & "-" & Day(Now) & " " & Hour(Now) & ":" & Minute(Now) & ":" & Second(Now) 
    filepath = "\\network\path\file.csv" 
    Set oCSV = OpenCSV(filepath) 
    oCSV.WriteLine(currentDate) 
    oCSV.Close 

    Function OpenCSV(path) 
    Set oFS = CreateObject("Scripting.FileSystemObject") 
    For i = 0 To 30 
     On Error Resume Next 
     Set oFile = oFS.OpenTextFile(path, ForAppending, True) 
     If Not Err.Number = 70 Then 
     Set OpenCSV = oFile 
     Exit For 
     End If 
     On Error Goto 0 
     Wscript.Sleep 1000 
    Next 
    Set oFS = Nothing 
    Set oFile = Nothing 
    If Err.Number = 70 Then 
     MsgBox "File " & filepath & " is locked and timeout was exceeded.", vbCritical 
     WScript.Quit 
    End If 
    End Function 
संबंधित मुद्दे

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