我已经用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等待复制(也移动)文件,直到文件不再使用?
由于
答案 0 :(得分:0)
如果你想创建一个漂亮的UI,你可以通过Ajax检查,如果复制过程顺利的话。
答案 1 :(得分:0)
嗯,事实证明在这种情况下等待不起作用:
尝试复制文件时,无法将文件从一个位置复制到同一位置,否则会抛出错误(显然)。 VB实际上试图复制文件而不是仅仅假装复制文件,而是因为复制操作试图复制到它复制的文件(至少overwrite:=True
)。
糟糕!
答案 2 :(得分: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 公共函数CheckIfFileIsInUse(ByVal sFile As String)作为布尔值 如果是System.IO.File.Exists(sFile)那么 尝试 Dim F As Short = FreeFile() FileOpen(F,sFile,OpenMode.Append,OpenAccess.Write,OpenShare.Shared) FILECLOSE(F) 抓住 返回True 结束尝试 万一 结束功能