2010-07-21 2 views
0

У меня есть приложение для интрасети ASP.NET, написанное на VB. Он получает файл от пользователя, а затем в зависимости от нескольких разных случаев он может создавать несколько копий файла, а также перемещать оригинал.ASP.NET Как ждать загрузки/выпуска файлов?

К сожалению, я наткнулся на случай, когда я получаю эту ошибку:

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. 

Который брошенную My.Computer.FileSystem.CopyFile. И это прекрасно, что он используется другим процессом - он все равно может сохранять/загружать пользователя или пытаться копировать, а другой поток (?) Копирует, меня это совсем не волнует, что я хочу знать:

Есть ли способ, которым я могу сказать, что VB ждет, чтобы скопировать (также переместить) файл до тех пор, пока файл больше не будет использоваться?

Thanks

ответ

0

Проверьте, используется ли файл и выполняйте то, что вам нужно.

Public WriteLogFile Sub (ByVal pText As String, ByVal psPath As String, ByVal psName As String)

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 

End Sub Public Function CheckIfFileIsInUse (ByVal sFile As String) As Boolean Если System.IO. File.Exists (sFile) Тогда Try Dim F As Short = FreeFile() FileOpen (F, sFile, OpenMode.Append, OpenAccess.Write, OpenShare.Shared) FileClose (F) Поймайте возвращающие End Try End If Конечная функция

0

Хм ... нет напрямую. Что делает большинство реализаций, делает попытку копирования файла с небольшим временным интервалом (несколько секунд)

Если вы хотите создать приятный пользовательский интерфейс, вы можете проверить через Ajax, если процесс копирования прошел хорошо.

0

Ну, получается, что ожидание не будет работать в этом случае:

При попытке скопировать файл, который вы не можете скопировать файл из одного места в том же месте, или выдаст ошибку (по-видимому). Вместо того, чтобы просто притворяться, что вы копируете файл, VB на самом деле пытается скопировать файл и терпит неудачу, потому что операция копирования пытается скопировать в файл, который он копирует (по крайней мере, с overwrite:=True).

Огонь!

Смежные вопросы