Imports System.IO
Imports System.Threading
Imports System.Text

Module Mod_Copy '//파일이동 모듈파일
   

    Public Sub MoveFileRCopy(winhide As Boolean)
        Dim SrcFI As FileInfo = Nothing
        Dim DesFi As FileInfo = Nothing

        Dim SrcFIp As String '//ft용 160328
        Dim Err As Boolean = False
        Dim isFTP As Boolean = False

        If GetWorkDIr.StartsWith("ftp:/") Then isFTP = True

        MDiMain.MSG("파일복사중...")
        Application.DoEvents()

        Dim index As Integer = 0
        Dim endcnt As Integer = MDiMain.DataSet1.WorkList.Rows.Count - 1

        If MDiMain.DataSet1.WorkList Is Nothing Then
            If winhide Then
                MDiMain.Noti("MoveFileRCopy" + vbCrLf + "파일목록이 없습니다")
            Else
                MsgBox("작업파일목록이 존재하지않습니다." & vbCrLf & "진행할 수 없습니다", MsgBoxStyle.Information, "확인")
            End If
            Return
        End If

        Application.DoEvents()

        For Each Dr As ireaDataSet.WorkListRow In MDiMain.DataSet1.WorkList.Rows
            index += 1

            Application.DoEvents()

            MDiMain.ShowCnt1(index, endcnt, "파일복사")
            If Dr.오류 <> "" Then
                Errlog("선오류감지되어서 넘어갑니다(" & Dr.오류 & ")")
            Else
                Dim 원본파일명 As String = Dr.원본경로 & "\" & Dr.원본파일명
                Dim 대상파일명 As String = Dr.대상경로 & "\" & Dr.대상파일명

                If isFTP Then
                    SrcFIp = 원본파일명.Replace("\", "/")
                    SrcFIp = SrcFIp.Replace("//", "/")
                Else
                    If isFileName(원본파일명) Then
                        SrcFI = New FileInfo(원본파일명)
                    Else
                        Dr.성공 = "X"
                        Dr.오류 = "원본파일명오류:" + 원본파일명
                        Dr.EndEdit()
                        Continue For
                    End If
                End If

                If isFileName(대상파일명) Then
                    DesFi = New FileInfo(대상파일명)
                Else
                    Dr.성공 = "X"
                    Dr.오류 = "대상파일명오류:" + 대상파일명
                    Dr.EndEdit()
                    Continue For
                End If

                Application.DoEvents()

                '//ftp상태일때는 원본 백업을 하지 않는다.
                If Not isFTP Then
                    Try
                        Check_Backup(SrcFI, BakTag)
                    Catch ex As Exception
                        PLog.Add(ex.Message, True)
                        If winhide Then
                            MDiMain.Noti("백업정책실패: " + ex.Message)
                        Else
                            MsgBox("백업정책(Check_Backup이 실패했습니다)" & vbCrLf & "Baktag=" & BakTag & vbCrLf & "오류내용:" & ex.Message.ToString, MsgBoxStyle.Information, "메일보내주세요")
                        End If
                    End Try
                End If

                Application.DoEvents()

                Try
                    If Directory.Exists(DesFi.DirectoryName) = False Then
                        Directory.CreateDirectory(DesFi.DirectoryName) '//대상폴더생성
                    End If
                Catch ex As Exception

                    Dr.성공 = "X"
                    Dr.오류 = "대상폴더생성실패:" + ex.Message
                    Dr.EndEdit()

                    Errlog("대상폴더생성실패:" + DesFi.DirectoryName & vbCrLf + ex.Message.ToString)
                    Continue For
                End Try


                If DesFi.Exists Then
                    Dr.성공 = "△"
                    Dr.오류 = "대상파일존재 넘어감"
                    Dr.EndEdit()
                Else
                    If isFTP Then
                        Dim 재시도횟수 As Integer = 0
FTPDOWN:
                        Try
                            FTP_0.Download(SrcFIp, DesFi.FullName, True)
                            If System.IO.File.Exists(DesFi.FullName) Then
                                Dim fi As New System.IO.FileInfo(DesFi.FullName)
                                If fi.Length = 0 Then
                                    Dr.성공 = "X"
                                    Dr.오류 = "다운로드실패(0byte)"
                                    Dr.EndEdit()
                                Else
                                    Dr.성공 = "O"
                                    Dr.오류 = ""
                                    Dr.EndEdit()
                                    Continue For
                                End If
                            Else
                                Dr.성공 = "X"
                                Dr.오류 = "다운로드실패(대상파일이없음)"
                                Dr.EndEdit()
                            End If
                        Catch ex As Exception
                            Dr.성공 = "X"
                            Dr.오류 = "다운로드실패(예외:" + ex.Message + ")"
                            Dr.EndEdit()
                        End Try

                        Application.DoEvents()


                        If Dr.성공 = "X" Then
                            '//다운로드실패일때는 대상횟수로 연속 다운로드를 한다
                            If 재시도횟수 < MaxRetryCount Then
                                Dr.성공 = "■"
                                Dr.오류 = String.Format("재시도({0}/{1})", 재시도횟수, MaxRetryCount)
                                Dr.EndEdit()
                                재시도횟수 += 1
                                PLog.Add("재실행으로인한 지연시간")
                                MDiMain.Noti(String.Format("FTP Download 오류(재시도:{0}/{1})" + vbCrLf + SrcFIp, 재시도횟수, MaxRetryCount))
                                Form_Status.Refresh()
                                Threading.Thread.Sleep(2000)
                                GoTo FTPDOWN
                            Else
                                '//아무것도 하지않는다 이것은 오류이다.
                                Err = True
                                Continue For
                            End If
                        End If


                    Else

                        Try
                            '//일반파일은 기존대로 사용하도록 한다.
                            SrcFI.CopyTo(DesFi.FullName, True)
                            Dr.성공 = "O"
                            Dr.오류 = ""
                            Dr.EndEdit()
                        Catch ex As Exception
                            Err = True
                            Dr.성공 = "X"
                            Dr.오류 = "일반파일복사오류:" + ex.Message.ToString()
                            Dr.EndEdit()
                            Continue For
                        End Try

                    End If

                    Application.DoEvents()

                End If
            End If

        Next
        MDiMain.MSG("파일 [복사] 완료" & IIf(Err, "(일부파일에 오류가 발생하였습니다", ""))
        MDiMain.Noti("파일(복사)완료")
    End Sub

End Module
