Вопрос

У меня есть приложение 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).

Упс!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top