ASP.NET Come aspetto il caricamento del file / rilascio?
-
26-09-2020 - |
Domanda
Ho ricevuto l'applicazione Intranet ASP.NET scritta in VB.Ottiene un file dall'utente e, a seconda di alcuni casi diversi, potrebbe creare alcune copie del file e spostare l'originale.
Sfortunatamente ho incontrato un caso in cui ricevo questo errore:
Exception Details: System.IO.IOException: The process cannot access the file
'\\some\dir\D09_03_5_180_0.000-6.788.png' because it is being used by
another process.
.
che viene lanciato da My.Computer.FileSystem.CopyFile
.E va bene che è usato da un altro processo - potrebbe ancora essere salvato / scaricando dall'utente o cercando di copiare mentre un altro thread (?) Sta copiando, non mi interessa davvero, cosa voglio sapere: .
C'è un modo in cui posso dire a VB di attendere di copiare (anche spostarsi) il file finché il file non è più in uso?
Grazie
Soluzione
Test se il file è in uso e il fai ciò che devi fare.
Pubblico sub writelogfile (byval ptext come stringa, byval pspath come stringa, byval psname come stringa)
Dim strFullFileName As String
Dim Writer As System.IO.StreamWriter
Dim Fs As System.IO.FileStream
Try
Dim DirectoryHandler As New System.IO.DirectoryInfo(psPath)
strFullFileName = psPath & "\" & psName & Date.Today.Month.ToString & "-" & Date.Today.Day.ToString & "-" & Date.Today.Year.ToString & ".txt"
If Not DirectoryHandler.Exists() Then
Try
Monitor.Enter(fsLocker)
DirectoryHandler.Create()
Finally
Monitor.Exit(fsLocker)
End Try
End If
Try
If CheckIfFileIsInUse(strFullFileName) = True Then
Thread.Sleep(500) ' wait for .5 second
WriteLogFile(pText, psPath, psName)
If Not Fs Is Nothing Then Fs.Close()
If Not Writer Is Nothing Then Writer.Close()
Exit Sub
End If
Monitor.Enter(fsLocker)
Fs = New System.IO.FileStream(strFullFileName, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.Write)
Writer = New System.IO.StreamWriter(Fs)
Writer.WriteLine(Date.Now.ToString & vbTab & "ProcessID: " & Process.GetCurrentProcess.Id.ToString() & vbTab & pText)
Writer.Close()
Fs.Close()
Finally
Monitor.Exit(fsLocker)
End Try
Catch ex As Exception
Dim evtEMailLog As System.Diagnostics.EventLog = New System.Diagnostics.EventLog()
evtEMailLog.Source = Process.GetCurrentProcess.ProcessName.ToString()
evtEMailLog.WriteEntry(ex.Message, System.Diagnostics.EventLogEntryType.Error)
Finally
If Not Fs Is Nothing Then Fs.Close()
If Not Writer Is Nothing Then Writer.Close()
End Try
.
fine sub Funzione pubblica checkoffileisinuse (byval sfile come stringa) come booleano Se system.io.file.exists (SFILE) allora Provare Dim F come corto= FreeFile () Fileopen (F, SFile, OpenMode.Append, OpenAccess.Write, OpenShare.Shared) FileClose (f) Catturare Restituire true. Fine Try. Finisci se Funzione finale
Altri suggerimenti
hmm ... non direttamente. Ciò che stanno facendo la maggior parte delle implementazioni, sta facendo un tentativo di copiare il file, con un piccolo periodo di tempo (alcuni secondi)
Se vuoi fare una bella interfaccia utente, controlli tramite Ajax, se il processo di copia è andato bene.
Bene, si scopre che l'attesa non funzionerebbe in questo caso:
Quando si tenta di copiare un file non è possibile copiare un file da una posizione alla stessa posizione o lancerà un errore (apparentemente).Piuttosto che fingere di copiare il file, VB effettivamente tenta di copiare il file e fallisce perché l'operazione di copia sta tentando di copiare al file con cui copia (con overwrite:=True
almeno).
whoops!