我已经在vb中写了编写的asp.net intranet应用程序。它从用户获取文件,然后取决于几个不同的情况,它可能会创建文件的一些副本以及移动原始文件。

不幸的是,我遇到了一个我收到这个错误的情况:

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.
.

由世代odicetagcode抛出。这很好的是它正在被另一个进程使用 - 它仍然可以从用户节省/下载或尝试复制另一个线程(?)正在复制,我真的不关心这一点,我想知道什么:

有没有办法,我可以告诉vb等待复制(也移动)文件,直到文件不再使用?

感谢

有帮助吗?

解决方案

测试如果文件正在使用,并且执行您需要执行的操作。

公共子writelogfile(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
.

结束子 公共功能checkiffileisinuse(byval sfile作为字符串)作为布尔值 如果system.io.file.exists(sfile)那么 尝试 DIM F作为short= freefile() filepen(f,sfile,OpenMode.Append,OpenAccess.Write,OpenShare.shared) fileclose(f) 抓住 返回真实 结束尝试 万一 结束功能

其他提示

hmm ......不是直接的。 大多数实现都在做什么,正在重试复制文件,具有小的时间范围(几秒钟)

如果您想制作一个漂亮的UI,则通过AJAX检查,如果复制过程进展顺利。

好吧,事实证明,在这种情况下,等待不起作用:

在尝试复制文件时,您无法将文件从一个位置复制到同一位置,或者它将抛出错误(显然)。VB而不是假装复制文件,实际上尝试复制文件并失败,因为复制操作正在尝试复制到它从(至少是overwrite:=True至少)复制的文件。

哎呀!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top