質問

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!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top