0

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 に指示する方法はありますか?

ありがとう

4

3 に答える 3

0

ファイルが使用されているかどうかをテストし、必要なことを実行します。

Public Sub WriteLogFile(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 If System.IO.File.Exists(sFile)Then Try Dim F As Short = FreeFile()FileOpen(F、sFile、OpenMode.Append、OpenAccess.Write、OpenShare。 Shared)FileClose(F)Catch Return True End Try EndIfEnd関数

于 2011-06-11T01:52:29.813 に答える
0

さて、この場合、待機は機能しないことがわかりました。

ファイルをコピーしようとすると、ある場所から同じ場所にファイルをコピーできないか、(明らかに) エラーがスローされます。ファイルをコピーするふりをするだけでなく、VB は実際にファイルをコピーしようとして失敗します。これは、コピー操作が (overwrite:=True少なくとも) コピー元のファイルにコピーしようとしているためです。

おっと!

于 2010-07-21T16:07:33.327 に答える
0

うーん...直接ではありません。ほとんどの実装が行っていることは、短い時間枠 (数秒) でファイルのコピーを再試行することです。

いいUIを作りたければAjax経由でコピーがうまくいったかチェックする。

于 2010-07-21T15:14:31.867 に答える