2016-06-16 10 views
-1

Я использую следующий код для итерации коллекции файлов, которые мне нужно скопировать из одной папки в другую. Он отлично работает, когда существует исходный файл, но когда он не существует, я получаюПолучение Невозможно получить доступ к закрытой ошибке файла

System.ObjectDisposedException: не удается получить доступ к закрытому файлу. в System.IO .__ Ошибка.FileNotOpen() в System.IO.FileStream.get_Position()

Что мне здесь не хватает?

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

где он бросает? –

+0

Это ошибка, которую я получаю на сервере, который запускает приложение. System.ObjectDisposedException: не удается получить доступ к закрытому файлу. at System.IO .__ Ошибка.FileNotOpen() у System.IO.FileStream.get_Position() – MTplus

+1

номер строки? –

ответ

1

Попробуйте вычислить значение перед тем, как положить его в действие. Вы также должны избавиться от потоков, когда они будут с ними сделаны

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

Это трюк, спасибо большое! – MTplus