ASP.NET Как я ждать загрузки / релиза файлов?
-
26-09-2020 - |
Вопрос
У меня есть приложение INTRANET ASP.NET, написанное в VB.Он получает файл от пользователя, а затем в зависимости от нескольких разных случаев может создать несколько копий файла, а также переместить оригинал.
К сожалению, я наткнулся на случай, когда я получаю эту ошибку:
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.
.
, который брошен генеракодицетагкодом.И это хорошо, что он используется другим процессом - он может быть сохранен / загружать от пользователя или пытаться скопировать, когда другой нить (?) Копирует, я не забочусь об этом, что я хочу знать: .
Есть ли способ, которым я могу сказать VB, чтобы дождаться, чтобы копировать (также переместить) файл, пока файл больше не используется?
Спасибо
Решение
Тест, если файл используется, и то делать то, что вам нужно сделать.
Общественный sub writeLogfile (ByVal Ptext как String, Byval Pspath в виде строки, ByVal PSname в качестве строки)
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
.
конец sub Public Function Checkiffileisinuse (Byval SFILE как String) как логический Если system.io.file.exists (sfile) тогда Пытаться Dim f как коротка= freefile () Fileopen (f, sfile, openmode.append, openaccess.crite, openshare.shared) FileClose (F) Ловить Вернуть правда Конец попробовать Конец, если Конечная функция
Другие советы
hmm ... не напрямую. Что делают большинство реализаций, делает попытку копирования файла, с небольшим таймфреймом (в несколько секунд)
Если вы хотите сделать хороший интерфейс, вы проверяете через AJAX, если процесс копирования прошел хорошо.
Ну, оказывается, что ожидание не будет работать в этом случае:
При попытке скопировать файл, который вы не можете скопировать файл из одного местоположения в одно и то же место, или он бросит ошибку (видимо).Вместо того, чтобы просто притворяться, чтобы скопировать файл, VB на самом деле пытается скопировать файл и не удается, потому что операция копирования пытается скопировать в файл, он копирует (с помощью overwrite:=True
).
Упс!