Domanda

Ho ricevuto l'applicazione Intranet ASP.NET scritta in VB.Ottiene un file dall'utente e, a seconda di alcuni casi diversi, potrebbe creare alcune copie del file e spostare l'originale.

Sfortunatamente ho incontrato un caso in cui ricevo questo errore:

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

che viene lanciato da My.Computer.FileSystem.CopyFile.E va bene che è usato da un altro processo - potrebbe ancora essere salvato / scaricando dall'utente o cercando di copiare mentre un altro thread (?) Sta copiando, non mi interessa davvero, cosa voglio sapere: .

C'è un modo in cui posso dire a VB di attendere di copiare (anche spostarsi) il file finché il file non è più in uso?

Grazie

È stato utile?

Soluzione

Test se il file è in uso e il fai ciò che devi fare.

Pubblico sub writelogfile (byval ptext come stringa, byval pspath come stringa, byval psname come stringa)

  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
.

fine sub Funzione pubblica checkoffileisinuse (byval sfile come stringa) come booleano Se system.io.file.exists (SFILE) allora Provare Dim F come corto= FreeFile () Fileopen (F, SFile, OpenMode.Append, OpenAccess.Write, OpenShare.Shared) FileClose (f) Catturare Restituire true. Fine Try. Finisci se Funzione finale

Altri suggerimenti

hmm ... non direttamente. Ciò che stanno facendo la maggior parte delle implementazioni, sta facendo un tentativo di copiare il file, con un piccolo periodo di tempo (alcuni secondi)

Se vuoi fare una bella interfaccia utente, controlli tramite Ajax, se il processo di copia è andato bene.

Bene, si scopre che l'attesa non funzionerebbe in questo caso:

Quando si tenta di copiare un file non è possibile copiare un file da una posizione alla stessa posizione o lancerà un errore (apparentemente).Piuttosto che fingere di copiare il file, VB effettivamente tenta di copiare il file e fallisce perché l'operazione di copia sta tentando di copiare al file con cui copia (con overwrite:=True almeno).

whoops!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top