ASP.NETファイルのアップロード/リリースを待機する方法
-
26-09-2020 - |
質問
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
によってスローされている。そしてそれが別のプロセスによって使用されているのはうまくいっています - それはまだユーザーから保存/ダウンロードすること、または別のスレッド(?)がコピーされている間にコピーしようとしているかもしれません、私は本当にそれを気にしません。/ P>
ファイルが使用されなくなるまでファイルをコピーするのを待つようにVBに知らせる方法はありますか?
ありがとう
解決
ファイルが使用中の場合はテストし、あなたがする必要があることを行います。
パブリックサブWRITELOGFILE(StringとしてのBYVAL PTEXT、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
.
終了サブ ブール値としてのPublic Function CheckileSinuse(StringとしてのByVal SFILE) system.io.file.exists(sfile)の場合 お試しください 短= freefile() fileopen(f、sfile、openmode.append、OpenAccess.Write、OpenShare.Shared) fileclose(f) キャッチ trueを返します 最後に試してみる 終わり 終了関数
他のヒント
HMM ...直接ではありません。 ほとんどの実装が行われているのは、小さい時間枠(数秒)
で、ファイルをコピーするリトライをしています。あなたが素敵なUIを作りたいのなら、コピープロセスがうまくいったらAjaxで確認します。
ええと、この場合はうまくいかないことがわかりました。
ファイルをコピーしようとすると、ファイルを1つの場所から同じ場所にコピーすることも、エラー(明らかに)スローします。ファイルをコピーするふりをしているのではなく、VBは実際にはファイルのコピーを試み、コピー操作は(少なくともoverwrite:=True
を使用して)ファイルにコピーしようとしているために失敗します。
Whoops!