2010-07-21 21 views
0

J'ai une application intranet ASP.NET écrite en VB. Il obtient un fichier de l'utilisateur, puis en fonction de quelques cas différents, il peut créer quelques copies du fichier ainsi que déplacer l'original.ASP.NET Comment puis-je attendre le téléchargement/la sortie du fichier?

Malheureusement, je suis tombé sur un cas où je reçois cette erreur:

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. 

Ce qui est jeté par My.Computer.FileSystem.CopyFile. Et c'est bien qu'il soit utilisé par un autre processus - il peut encore être en train d'enregistrer/télécharger de l'utilisateur ou d'essayer de copier alors qu'un autre thread (?) Copie, je m'en fous, ce que je veux savoir:

Est-il possible de dire à VB d'attendre de copier (déplacer aussi) le fichier jusqu'à ce que le fichier ne soit plus utilisé?

Merci

Répondre

0

Testez si le fichier est utilisé et effectuez ce que vous devez faire.

Sous WriteLogFile publique (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 Fonction publique CheckIfFileIsInUse (ByVal sFile As String) As Boolean Si System.IO. File.Exists (sfile) Ensuite Try Dim F = Le plus court FreeFile() FileOpen (F, sFile, OpenMode.Append, OpenAccess.Write, OpenShare.Shared) FileClose (F) Catch Retour vrai End Try Fin Si Fin Fonction

0

Hmm ... pas directement. Ce que font la plupart des implémentations, est de réessayer de copier le fichier, avec une petite période (quelques secondes)

Si vous voulez créer une interface utilisateur sympa, vous vérifiez via Ajax si le processus de copie s'est bien passé.

0

Eh bien, il se trouve que l'attente ne fonctionnerait pas dans ce cas:

Lorsque vous essayez de copier un fichier que vous ne pouvez pas copier un fichier d'un emplacement au même endroit ou il jetterez une erreur (apparemment). Plutôt que de simplement faire semblant de copier le fichier, VB essaie en fait de copier le fichier et échoue car l'opération de copie tente de copier dans le fichier en cours de copie (avec overwrite:=True au moins).

Oups!