2010-10-03 4 views
0

J'utilise vb.net 2005, j'ai le code suivant exécutant un fil pour télécharger un fichier. Toutefois, le processus échoue parfois lors de la tentative de lecture de la copie locale du fichier. Je pense que je devrais peut-être déverrouiller le fichier local, mais je ne suis pas sûr de savoir comment le faire. Quelqu'un peut-il jeter un coup d'oeil et me conseiller?vb.net 2005, problème de verrouillage de fichier enfilant, je pense

Dim BP1Ended As Boolean = False 
Private Sub BackgroundProcess1() 
    BP1Ended = False 
    mPadFileStatus = DownloadFile(mstrPadUrl, mLocalFile) 
    BP1Ended = True 
End Sub 

'---' 
Dim t As System.Threading.Thread 

t = New System.Threading.Thread(AddressOf BackgroundProcess1) 
t.Start() 

Dim ProcessStartTime As Date = Now() 

Do While ProcessStartTime.AddMinutes(1) >= Date.Now 

Application.DoEvents() 
If BP1Ended = True Then 
    Exit Do 
End If 
Loop 
t.Abort() 

PadFileStatus = mPadFileStatus 

If BP1Ended = False Then 
    Application.DoEvents() 
    AddConsoleMsg("Downloading file.... Aborted", True) 
End If 

'---' 
Public Function DownloadFile(ByVal pstrRequestedFile As String, ByVal pstrDestinationFile As String, Optional ByVal TimeOut As Integer = 120) As DownloadStatus 
Dim input As IO.Stream 
Dim Req As System.Net.HttpWebRequest = Nothing 
Dim Response As System.Net.HttpWebResponse 

Try 
    Req = System.Net.HttpWebRequest.Create(pstrRequestedFile) 
Catch ex As Exception      
    Return DownloadStatus.UnknownError 
End Try 

Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 

Req.Timeout = TimeOut * 1000 '120 * 1000 '1 second = 1 000 milliseconds 
Try 
    Response = Req.GetResponse 
    input = Response.GetResponseStream 

    Dim streamreader As New StreamReader(input, System.Text.Encoding.GetEncoding("windows-1252")) 'System.Text.Encoding.UTF8)' 
    Dim s_response As String = streamreader.ReadToEnd() 
    streamreader.Close() 

    Dim filestream As New FileStream(pstrDestinationFile, FileMode.Create) 
    Dim streamwriter As New StreamWriter(filestream, System.Text.Encoding.GetEncoding("windows-1252")) ' System.Text.Encoding.UTF8)' 
    streamwriter.Write(s_response) 
    streamwriter.Flush() 
    streamwriter.Close() 

    Dim length As Long = 1000000 * 100 
    Dim pos As Long = 0 
    If Response.ContentLength > 0 Then 
    length = Response.ContentLength 
    End If 

    If length > 0 Then 
    Return DownloadStatus.OK 
    End If 

    input.Close() 

Catch ew As System.Net.WebException 

    If ew.Status = WebExceptionStatus.NameResolutionFailure Or ew.Status = WebExceptionStatus.ProtocolError Then 
    Return DownloadStatus.FileNotFound 
    ElseIf ew.Status <> WebExceptionStatus.Success Then 
    Return DownloadStatus.UnknownError 
    End If 
    'Dim errorRespone As HttpWebResponse = CType(ew.Response, HttpWebResponse) 
    'If errorRespone.StatusCode = HttpStatusCode.NotFound Then '404 
    ' Return DownloadStatus.FileNotFound 
    'Else 
    ' Return DownloadStatus.UnknownError 
    'End If' 
Catch ex As Exception           'Don't know' 

    Return DownloadStatus.UnknownError 
End Try 

End Function 

'---' 
Dim OpenFile As FileStream 
'OpenFile = New FileStream(pstrPadFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) 
'FAILS HERE 
OpenFile = New FileStream(pstrPadFile, FileMode.Open, FileAccess.Read, FileShare.Read) 

Répondre

2

Vous ne fermez pas le flux de fichier en cas d'exception pouvant entraîner le verrouillage. Assurez-vous de toujours disposer des ressources à usage unique en les enveloppant dans Using déclarations:

Using filestream As FileStream = New FileStream(pstrDestinationFile, FileMode.Create) 
    Using streamwriter As StreamWriter = New StreamWriter(filestream, Encoding.GetEncoding("windows-1252")) 
     streamwriter.Write(s_response) 
    End Using 
End Using 

même se tient vrai pour les flux de réponse et de réponse. Ils devraient être correctement éliminés.

En outre, vous pouvez envisager d'utiliser la classe WebClient qui a des méthodes comme DownloadFile et DownloadData qui pourrait rendre votre vie beaucoup plus facile.

+0

OK, cool, donc je n'ai pas besoin de flush et ferme après l'écriture? – Jules

+0

Non, vous n'avez besoin ni de «Flush», ni de «Close». 'Dispose' fera les deux. Et l'envelopper dans une instruction 'Using' garantira que' Dispose' est appelé même si une exception est levée. –

Questions connexes