2011-01-03 7 views
0

Ich habe den folgenden Teil des VBSCript-Codes, um einen Abschnitt (strSection) und ein Element in diesem Abschnitt (StrItem) in einer Nur-Text-Datei zu finden.Wie kann ich die Wartezeit zwischen zwei Methoden, die auf die gleiche Datei zugreifen, loswerden?

Do While Not myINIFile.AtEndOfStream 
    sl_Sleep(100) 
    s = myINIFile.ReadLine <--- **This is the line that rises the exception** 
    If s = strSection Then 
    'Find the correct line 
    Do While Not myINIFile.AtEndOfStream 
     s = myINIFile.ReadLine 
     If InStr(s, strItem)>0 Then 
     Exit Do 
     End if    
    Loop    
    Exit Do 
    End if    
Loop 

Es scheint, dass, wenn ich nicht die eingeschläfert (100) (Millisekunden) (oder niedrigere Werte verwenden wie 20 oder 50) ich schließlich eine Ausnahme erhalten, dass „Der Prozess sagt die Datei nicht, da ein anderer Prozess zugreifen hat einen Teil der Datei gesperrt ".

Ich denke, dass die Bedingung in der Do While die ReadLine-Methode aufgerufen wird, während der AtEndOfStream noch nicht beendet ist. Die Verwendung von 100 ms für jede Leitung verlangsamt jedoch den Prozess auf nicht akzeptable Geschwindigkeiten.

Ist das was wirklich passiert oder ist das Problem woanders? Gibt es etwas, was ich tun kann, um zu verhindern, dass dieser Prozess gesperrt wird oder ein wenig mehr wartet (bis es freigegeben wird) nur wenn es gesperrt ist, so dass es keine Ausnahme auslöst?


EDIT: Dieser Code Schleifen durch eine Datei, die wie folgt aussieht: angeblich durch die Datei gehen, wird

[Section1]  
param1 = 100  
param2 = 200  
param3 = 300  

[Section2]  
param1 = 1000  
param2 = 2000  
param3 = 3000 

[Section3]  
param1 = 1 
param2 = 2 
param3 = 5 
param4 = 10 
param5 = 20 

Der Code, bis er die [SectionX] Zeile (strSection) und dann halten findet Lesen von Zeilen, bis sie die Zeile "paramx" (strItem) findet. Diese Zeile wird dann in 's' gespeichert und später verarbeitet.

+1

Funktioniert dieser Code? Wenn Sie einen Blick darauf werfen, sieht es so aus, als würden Sie einen Datei-Stream durchlaufen, bis Sie eine Übereinstimmung erhalten. Dann wiederholen Sie den gleichen Stream erneut. Was verwirrend ist, ist, dass es nichts zu tun scheint. Sobald Sie eine Zeile gefunden haben, die Ihren Suchkriterien entspricht, wird die Schleife einfach beendet. Ich denke, wenn Sie eine Probe der Daten gepostet haben, die Sie versuchen zu analysieren, könnte es helfen. – unrealtrip

+0

Der Code funktioniert, obwohl es diese Art von Engpass hat. Weitere Informationen finden Sie unter Bearbeitete Beschreibung. – EKI

+0

Ich stimme @unrealtrip zu, Sie haben zwei Schleifen, aber beide lesen vom gleichen Stream-Objekt, so dass es den Stream nicht sperren sollte. Schließen Sie den Stream zwischen Aufrufen dieser Funktion ordnungsgemäß? – invert

Antwort

1

der Code, den Sie geschrieben haben, funktioniert perfekt für mich. Ich bekomme keine Ausnahme ...

greifen Sie auf die Datei woanders hin, während Sie Ihren gebuchten Code verwenden?

haben Sie versucht, die gesamte Datei zu lesen und dann die Zeichenfolge zu analysieren? siehe http://www.motobit.com/tips/detpg_asp-vbs-read-write-ini-files/

+0

Die Datei, die ich gepostet habe, ist ein Beispiel. Die Datei, die ich habe, ist viel größer als das (25 bis 35 KBytes). Der Code wird funktionieren, das Problem ist, dass die Sleep (100) -Linie es viel langsamer macht, als ich es möchte. Aber wenn ich die Schlaflinie heraus nehme (oder sie auf 50 ms reduziere), gibt es diese Ausnahme im Readline-Befehl. – EKI

+0

versuchen Sie es mit dem "Do While Not myINIFile.AtEndOfStream" nur einmal. Sie haben also nur eine Schleife und dann eine Variable, wenn Sie den Abschnitt und eine zweite Variable gefunden haben, wenn Sie den Parameter gefunden haben. diese zwei Variablen können Sie als Exit-Bedingung für die Schleife verwenden – ulluoink

+0

Ich bekomme nicht in der zweiten Schleife, bis ich den Abschnitt gefunden habe (siehe die IF-Anweisung zuvor) und danach habe ich eine "Exit Do", gefolgt von einem anderen "Exit Machen'. Das Problem ist, dass der Abschnitt, den ich an einigen Punkten suche, weit am Ende der Datei liegt. – EKI

0

Funktion readini (myFilePath, mySection, myKey) 'Diese Funktion einen Wert aus einer INI-Datei lesen gibt ' 'Argumente: ' myFilePath [string] der (Pfad und Datei) Name der INI-Datei 'mySection [string] der Abschnitt in der zu durchsuchenden INI-Datei ' myKey [string] der Schlüssel, dessen Wert zurückgegeben werden soll ' ' der Wert [string] für den angegebenen Schlüssel im angegebenen Abschnitt '

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

Dim intEqualPos 
Dim objFSO, objIniFile 
Dim strFilePath, strKey, strLeftString, strLine, strSection 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

ReadIni  = "" 
strFilePath = Trim(myFilePath) 
strSection = Trim(mySection) 
strKey  = Trim(myKey) 

If objFSO.FileExists(strFilePath) Then 
    Set objIniFile = objFSO.OpenTextFile(strFilePath, ForReading, False) 
    Do While objIniFile.AtEndOfStream = False 
     strLine = Trim(objIniFile.ReadLine) 

     ' Check if section is found in the current line 
     If LCase(strLine) = "[" & LCase(strSection) & "]" Then 
      strLine = Trim(objIniFile.ReadLine) 

      ' Parse lines until the next section is reached 
      Do While Left(strLine, 1) <> "[" 
       ' Find position of equal sign in the line 
       intEqualPos = InStr(1, strLine, "=", 1) 
       If intEqualPos > 0 Then 
        strLeftString = Trim(Left(strLine, intEqualPos - 1)) 
        ' Check if item is found in the current line 
        If LCase(strLeftString) = LCase(strKey) Then 
         ReadIni = Trim(Mid(strLine, intEqualPos + 1)) 
         ' In case the item exists but value is blank 
         If ReadIni = "" Then 
          ReadIni = " " 
         End If 
         ' Abort loop when item is found 
         Exit Do 
        End If 
       End If 

       ' Abort if the end of the INI file is reached 
       If objIniFile.AtEndOfStream Then Exit Do 

       ' Continue with next line 
       strLine = Trim(objIniFile.ReadLine) 
      Loop 
     Exit Do 
     End If 
    Loop 
    objIniFile.Close 
Else 
    WScript.Echo strFilePath & " doesn't exists. Exiting..." 
    Wscript.Quit 1 
End If 

Ende Funktion

+0

Ich werde das versuchen, wenn ich etwas Zeit habe, aber es gibt mehrere Stellen, wo es einen AtEndOfStream gefolgt von einer ReadLine gibt, also frage ich mich wirklich, ob dies einen Unterschied machen würde ... – EKI

+0

Dies ist sehr schwer zu lesen sechs Ebenen tief verschachtelt do/loop, wenn/then blockt, das auch einen mehrfachen readline-Aufruf an den Dateistrom verwendet und kein funktionsfähiger Code ist. – unrealtrip

+0

das ist von cource arbeiten - nur kopieren einfügen sollten Sie in der Lage, das zu tun. es ist nur falsch formatiert von stackoverflow ... – ulluoink

1

Hier gehen Sie, dieser Code wird die Schleife durchführen. Das Problem, das Sie hatten, bestand darin, die readline für den gleichen Stream wiederzuverwenden, und es wurde nach dem EOF (und/oder) nach dem Erstellen einer Dateisperrenkonkurrenz gesucht.

Const TristateFalse = 0 
Const ForReading = 1 

strINIfile = "c:\scripts\testconfig.ini" 
strSection = "[Section2]" 
strItem = "param3" 

Set objFSO = WScript.CreateObject("Scripting.Filesystemobject") 
Set objINIstream = objFSO.OpenTextFile(strINIfile, ForReading, False, TristateFalse) 

boolCheckSection = False 

Do While Not objINIstream.AtEndOfStream 
    strLine = Trim(objINIstream.ReadLine) 

    ' Determine if we're in the section, set boolcheck if so 
    If InStr(UCase(strLine),UCase(strSection)) Then  
     boolCheckSection = True  
    ElseIf InStr(UCase(strLine), "[") Then 
     boolCheckSection = False 
    End If 

    ' If so, read the proper value and store in variable 
    If boolCheckSection Then 
     If InStr(UCase(strLine), UCase(strItem)) Then 
      tmpParam = Split(strLine, "=") 
      strParamValue = Trim(tmpParam(1)) 
      Exit Do ' exit loop with set variable 
     End If  
    End If 

Loop 

WScript.Echo strParamValue 
+0

Dieser Code enthält natürlich keine Fehlerbehandlung und ist nicht als Funktion eingerichtet, es funktioniert einfach Code. Sie müssen es ändern, um im Rahmen Ihres Programms zu arbeiten. – unrealtrip

0

Vielen Dank an alle für Ihre Antworten. Wenn ich meine vorgeschlagenen Codes ansehe und sie studiere, merke ich, dass an meinem eigenen Code überhaupt nichts falsch ist (obwohl es 2 while-Schleifen gab, hat es sie richtig verlassen). Nachdem ich Ihre vorgeschlagenen Codes getestet hatte, stellte ich fest, dass es zufällig in meinen Testfällen bestätigt wurde und nachdem ich darüber nachgedacht hatte, erkannte ich, dass die Hauptanwendung, auf die ich testet, immer noch auf diese Datei zugreift (obwohl ich nicht weiß, wofür).

Die Lösung, die ich fand, war eine, die wir immer vorschlagen, wenn wir manuell testen; Kopiere das Original und arbeite an der Kopie.

Auch, danke für Ihre vorgeschlagenen Codes, gaben sie mir verschiedene Blickwinkel, um meine Code-Design und Lesbarkeit zu verbessern.

Verwandte Themen