Jag skall läsa en fil vars innehåll jag lagrar i ett cache-objekt. Fick följande lösning som verkar lira klockrent: OK, men du bör komplettera med någon form av räknare som stannar vid t.ex. 100 försök så att du inte hamnar i en evighetsloop - om operativet eller extern fil av någon anledning felar så att filen inte frisläpps.. Satt nyss och funderade på det Om jag vore du skulle jag stoppa det där i en oändlig loop istället, allt en for-loop. <code> Tack!Läs fil när den är ledig (låst när den skrivs)
Filen skrivs av ett externt program till en mapp i webapplikationen.
Cachen "dör", ny fil har skrivits till mappen, använder FileDependency.
Om jag gör en läsning exakt samtidigt som filen skrivs får jag ett felmeddelande;
<info>
Exception Details: System.IO.IOException: The process cannot access the file "D:\InetPubProj\GisSolution\gis\reports\gisftg.ttx" because it is being used by another process.
</info>
Min kod för att läsa in filen till cachen:
Felmeddelandet kommer på raden med koden:
sr = File.OpenText(FileName)
<code>
Private Sub SetCacheData(ByVal FileName As String, ByVal ChacheName As String)
Dim strText As String
Dim sr As StreamReader
Dim arrSchemaValues As Array
' Kontrollera att filen finns
If File.Exists(FileName) Then
' öppna filen
sr = File.OpenText(FileName) '<******* felrad
' läs in hela innehållet i strText
strText = sr.ReadToEnd()
' Ersätt " och vbcrlf, det som återstår är data som är tabbseparerad
strText = strText.Replace("""", "")
strText = strText.Replace(vbCrLf, "")
' Lägg in värdena i array
arrSchemaValues = Split(strText, vbTab)
' stäng StreamReader
sr.Close()
' Lägg till array i Cache och bind den till filen
Current.Cache.Insert(ChacheName, arrSchemaValues, New CacheDependency(FileName))
End If
End Sub
</code>
Hur skall jag bygga upp min felhantering för att jag skall vänta att läsa filen är skriven av det andra programmet?
Hade några funderingar på att använda sleep eller nån "loop until file is not locked..." i den stilen men känner mig för osäker om ur/var jag skall implementera denna koden.Sv: Läs fil när den är ledig (låst när den skrivs)
<code>
Private Sub SetCacheData(ByVal FileName As String, ByVal ChacheName As String)
Dim strText As String
Dim sr As StreamReader
Dim arrSchemaValues As Array
' Kontrollera att filen finns
If File.Exists(FileName) Then
Try
' öppna filen
sr = File.OpenText(FileName)
' läs in hela innehållet i strText
strText = sr.ReadToEnd()
' Ersätt " och vbcrlf, det som återstår är data som är tabbseparerad
strText = strText.Replace("""", "")
strText = strText.Replace(vbCrLf, "")
' Lägg in värdena i array
arrSchemaValues = Split(strText, vbTab)
' stäng StreamReader
sr.Close()
' Lägg till array i Cache och bind den till filen
Current.Cache.Insert(ChacheName, arrSchemaValues, New CacheDependency(FileName))
Catch e as Exception
'Ett fel uppstod så vi låter sidan sova 250 millisekunder för att sedan anropa samma sub
System.Threading.Thread.Sleep(250)
Call SetCacheData(FileName, ChacheName)
End Try
End If
End Sub
</code>Sv: Läs fil när den är ledig (låst när den skrivs)
Om det ändå misslyckas bör du ge användaren en möjlighet att köra det igen (inkl programmets egna försök-igen-loop)
OlaSv: Läs fil när den är ledig (låst när den skrivs)
Provade en lösning får att se hur jag skulle kunna få till det
Satte en global variabel i vb-filen som jag ökade med 1 varje gång SetCacheData kördes
Försökte sedan skriva ner den variablen efter det att funktion kört klart, men hela tiden får jag bara att variablen är 0
Har du ett tips så kanske jag slipper grotta mer i det imorgon =)Sv: Läs fil när den är ledig (låst när den skrivs)
Sv: Läs fil när den är ledig (låst när den skrivs)
Private Sub SetCacheData(ByVal FileName As String, ByVal ChacheName As String)
Dim strText As String
Dim sr As StreamReader
Dim arrSchemaValues As Array
' Kontrollera att filen finns
If File.Exists(FileName) Then
Dim i As Integer
For i = 0 To 100 'Maxgräns för antal loopningar
Try
' öppna filen
sr = File.OpenText(FileName)
' läs in hela innehållet i strText
strText = sr.ReadToEnd()
' Ersätt " och vbcrlf, det som återstår är data som är tabbseparerad
strText = strText.Replace("""", "")
strText = strText.Replace(vbCrLf, "")
' Lägg in värdena i array
arrSchemaValues = Split(strText, vbTab)
' stäng StreamReader
sr.Close()
' Lägg till array i Cache och bind den till filen
Current.Cache.Insert(ChacheName, arrSchemaValues, New CacheDependency(FileName))
Exit For 'Hopp ur loopen om allt gick bra
Catch e as Exception
'Ett fel uppstod så vi låter sidan sova 250 millisekunder för att sedan anropa samma sub
System.Threading.Thread.Sleep(250)
End Try
Next
End If
End Sub
</code>Sv: Läs fil när den är ledig (låst när den skrivs)
Låter som en säkrare lösning
har iofs testkört nu i ett dygn snart och hitintills har allt lirat ok, men skall nog köra med din kod eftersom den ger lite mer "hängslar och livrem"
Tack till alla som hjälpt till med denna tråden!