2016-06-16 1 views
-1

J'utilise le code suivant pour réitérer une collection de fichiers que j'ai besoin de copier d'un dossier à un autre. Cela fonctionne bien quand le fichier source existe, mais quand il n'existe pas, j'obtiensGetting Impossible d'accéder à une erreur de fichier fermé

System.ObjectDisposedException: Impossible d'accéder à un fichier fermé. à System.IO .__ Error.FileNotOpen() à System.IO.FileStream.get_Position()

Qu'est-ce que je manque ici?

For Each itm In listOfFiles 
    Try 
     If File.Exists(itm.SourcePath + itm.FileName) Then 

      Dim cf As New FileStream(itm.SourcePath + itm.FileName, FileMode.Open) 
      Dim ct As New FileStream(itm.DestinationPath + itm.FileName, FileMode.Create) 
      Dim len As Long = cf.Length - 1 
      Dim buffer(1024) As Byte 
      Dim byteCFead As Integer 
      While cf.Position < len 
       byteCFead = (cf.Read(buffer, 0, 1024)) 
       ct.Write(buffer, 0, byteCFead) 
       fileCopyProgressBar.BeginInvoke(New Action(Sub() fileCopyProgressBar.Value = CInt(cf.Position/len * 100))) 

      End While 
      ct.Flush() 
      ct.Close() 
      cf.Close() 

      itm.FileExsits = True 

     Else 
      itm.FileExsits = False 
     End If 

    Catch ex As Exception 
     log.Error(ex.Message & " (unc)") 
    End Try 
Next 
+2

où lance-t-il? –

+0

C'est l'erreur que j'obtiens sur le serveur qui exécute l'application. System.ObjectDisposedException: Impossible d'accéder à un fichier fermé. à System.IO .__ Error.FileNotOpen() à System.IO.FileStream.get_Position() – MTplus

+1

quel numéro de ligne? –

Répondre

1

Essayez de calculer la valeur avant de la placer dans l'action. Vous devez également disposer des flux lorsque vous en avez fini avec eux

For Each itm In listOfFiles 
    Try 
     If File.Exists(itm.SourcePath + itm.FileName) Then 
      Using cf As New FileStream(itm.SourcePath + itm.FileName, FileMode.Open) 
       Using ct As New FileStream(itm.DestinationPath + itm.FileName, FileMode.Create) 
        Dim len As Long = cf.Length - 1 
        Dim buffer(1024) As Byte 
        Dim byteCFead As Integer 
        Dim percentage As Integer 
        While cf.Position < len 
         byteCFead =(cf.Read(buffer, 0, 1024)) 
         ct.Write(buffer, 0, byteCFead) 
         percentage = CInt(cf.Position/len * 100) 
         fileCopyProgressBar.BeginInvoke(New Action(Sub() fileCopyProgressBar.Value = percentage)) 
        End While 

        ct.Flush() 
        ct.Close() 
        cf.Close() 
       End Using 
      End Using 

      itm.FileExsits = True 
     Else 
      itm.FileExsits = False 
     End If 
    Catch ex As Exception 
     log.Error(ex.Message & " (unc)") 
    End Try 
Next 
+0

Cela a fait l'affaire, merci beaucoup! – MTplus