Imports System.IO
'----------------------------------
' backup Class
'---------------------------------
Module Mod_Backup
    Public Backupfolder1 As New ArrayList

    Private Function ExistBakFolder1(ByVal FolderName As String) As Boolean
        '//지정된 폴더가 백업된 폴더목록에 존재하는지
        'addlog("기존백업폴더목록에 저장되어잇는지 : " & Backupfolder.IndexOf(FolderName))
        If Backupfolder1.IndexOf(FolderName) >= 0 Then Return True
        If MDiMain.cbBakTarget.SelectedIndex = 0 Then
            '//백업정책1이 폴더백업이고 하위폴더포함한 백업일경우에는 상위폴더가 백업되어잇는지 찾아야한다.
            For Each P As String In Backupfolder1  '//백업된 폴더의 모든 폴더명을 루프로돈다.
                '//백업된 폴더명이 루트라면 지금의 폴더명보다 더 짧을것이다. indexof 로 찾는다.
                If FolderName.ToUpper.IndexOf(P.ToUpper) >= 0 Then Return True
            Next
        End If
        Return False
    End Function


    Public Sub Check_Backup(ByVal fn As FileInfo, Optional ByVal tag As String = "")
        Dim BT1 As E_baktype = GetBackType1()   '//백업정책의 형태를 가져온다.
        If BT1 <> E_baktype.none Then
            If MDiMain.cbBakTarget.SelectedIndex = 0 Then
                Try
                    BT1WorkFD(BT1, fn, tag & "D") ' & "_FD") '//폴더백업
                Catch ex As Exception
                    Errlog("BT1WorkFD 정의" & ex.Message.ToString)
                End Try

            Else
                Try
                    BT1WorkFL(BT1, fn, tag & "F") ' & "_FL") '//파일백업
                Catch ex As Exception
                    Errlog("BT1WorkFL 정의" & ex.Message.ToString)
                End Try

            End If
        End If
       
    End Sub
    Private Sub BT1WorkFL(ByVal bt1 As E_baktype, ByVal fn As FileInfo, ByVal tag As String)
        Dim NewFn As String
        Dim NFN As FileInfo
        Select Case bt1
            Case E_baktype.none   '//아무것도 하지않는다.
            Case E_baktype.Folder1    '//지정된 1번 폴더에 복사를 해놓는다. 바귄파일의 상위폴더명을 원래폳러명+날짜+태그 로 한다.
                NewFn = fn.FullName.ToUpper.Replace(GetWorkDIr.ToUpper, GetBakDir1.ToUpper & "\" & tag)    '//작업폴더명은 백업폴더명으로 변경
                NFN = New FileInfo(NewFn)
                Addlog("B", fn.FullName, NFN.FullName, "파일백업(정책1-사용자지정폴더1)")
                NFN.Directory.Create()  '//디렉토리생성
                fn.CopyTo(NFN.FullName, True)
            Case E_baktype.CurrnetFolder '//해당파일이 발견된 폴더의 하위폴더를 생성해서 백업 폴더명은 위에꺼 참고
                NewFn = fn.DirectoryName & "\BAK_" & tag & "\" & fn.Name    '//현재폴더에 태그명으로 폴더를 만들고 그곳에 파일을 저장한다.
                NFN = New FileInfo(NewFn)
                Addlog("B", fn.FullName, NFN.FullName, "파일백업(정책1-현재폴더)")
                NFN.Directory.Create()  '//디렉토리생성
                fn.CopyTo(NFN.FullName, True)
            Case E_baktype.ParentFolder  '//해당파일이 발견된 폴더의 상위폴더를 생성 폳러명 위 참조
                NewFn = fn.Directory.FullName & tag & "\" & fn.Name  '//상위폴더에 생성
                NFN = New FileInfo(NewFn)
                Addlog("B", fn.FullName, NFN.FullName, "파일백업(정책1-상위폴더)")
                NFN.Directory.Create()  '//디렉토리생성
                fn.CopyTo(NFN.FullName, True)
        End Select
    End Sub

    Private Sub BT1WorkFD(ByVal bt1 As E_baktype, ByVal fn As FileInfo, ByVal tag As String) '//백업정책1 폴더백업
        Dim NewFn As String
        Dim NFN As FileInfo
        Dim FL() As FileInfo
        Select Case bt1
            Case E_baktype.none   '//아무것도 하지않는다.
            Case E_baktype.Folder1    '//지정된 1번 폴더에 복사를 해놓는다. 바귄파일의 상위폴더명을 원래폳러명+날짜+태그 로 한다.
                'Addlog2("백업사용자폴더1 파일명 : " & fn.FullName & " 태그:" & tag)
                NewFn = fn.FullName.ToUpper.Replace(GetWorkDIr.ToUpper, GetBakDir1.ToUpper & "\" & tag)    '//작업폴더명은 백업폴더명으로 변경
                NewFn = NewFn.Replace("\\", "\")
                'Addlog2("백업형태로 변경된 파일명 : " & NewFn)
                NFN = New FileInfo(NewFn)
                '//백업된폴더목록에 해당 목록이없으면 
                If ExistBakFolder1(NFN.DirectoryName) = False Then
                    MDiMain.MSG(NFN.DirectoryName & "폴더 백업중...")
                    MDiMain.Refresh()
                    Addlog("B", fn.FullName, NFN.FullName, "폴더백업(정책1-사용자지정폴더1)")
                    '//원본폴더의 모든 내용을 복사해논다.
                    Directory.CreateDirectory(NFN.DirectoryName)  '//디렉토리생성
                    FL = New DirectoryInfo(fn.DirectoryName).GetFiles("*.*", SearchOption.AllDirectories)  '//파일목록을 가져온다.

                    Dim index As Integer = 0
                    Dim endcnt As Integer = FL.Length

                    For Each F As FileInfo In FL
                        index += 1
                        MDiMain.ShowCnt2(index, endcnt, "백업")
                        My.Application.DoEvents()
                        Try
                            F.CopyTo(NFN.DirectoryName & "\" & F.Name, True)   '//새로운경로로 복사를 한다.
                        Catch ex As System.IO.DirectoryNotFoundException
                            Dim B As New System.IO.FileInfo(NFN.DirectoryName & "\" & F.Name)
                            System.IO.Directory.CreateDirectory(B.DirectoryName)
                            B = Nothing
                            F.CopyTo(NFN.DirectoryName & "\" & F.Name, True)   '//새로운경로로 복사를 한다.
                        Catch ex As Exception
                            MsgBox("파일복사오류 : " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "확인")
                        End Try
                    Next
                    Backupfolder1.Add(NFN.DirectoryName)
                    MDiMain.MSG(NFN.DirectoryName & "폴더 백업완료.")
                    MDiMain.Refresh()
                End If
            Case E_baktype.CurrnetFolder '//해당파일이 발견된 폴더의 하위폴더를 생성해서 백업 폴더명은 위에꺼 참고
                NewFn = fn.DirectoryName & "\BAK_" & tag & "\" & fn.Name    '//현재폴더에 태그명으로 폴더를 만들고 그곳에 파일을 저장한다.
                NFN = New FileInfo(NewFn)
                '//백업된폴더목록에 해당 목록이없으면 
                If ExistBakFolder1(NFN.DirectoryName) = False Then
                    MDiMain.MSG(NFN.DirectoryName & "폴더 백업중...")
                    MDiMain.Refresh()
                    Addlog("B", fn.FullName, NFN.FullName, "폴더백업(정책1-현재폴더)")
                    '//원본폴더의 모든 내용을 복사해논다.
                    Directory.CreateDirectory(NFN.DirectoryName)  '//디렉토리생성
                    FL = New DirectoryInfo(fn.DirectoryName).GetFiles("*.*", SearchOption.AllDirectories)

                    Dim index As Integer = 0
                    Dim endcnt As Integer = FL.Length

                    For Each F As FileInfo In FL
                        index += 1
                        MDiMain.ShowCnt2(index, endcnt, "백업")
                        My.Application.DoEvents()
                        Try
                            F.CopyTo(NFN.DirectoryName & "\" & F.Name, True)   '//새로운경로로 복사를 한다.
                        Catch ex As System.IO.DirectoryNotFoundException
                            Dim B As New System.IO.FileInfo(NFN.DirectoryName & "\" & F.Name)
                            System.IO.Directory.CreateDirectory(B.DirectoryName)
                            B = Nothing
                            F.CopyTo(NFN.DirectoryName & "\" & F.Name, True)   '//새로운경로로 복사를 한다.
                        Catch ex As Exception
                            MsgBox("파일복사오류 : " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "확인")
                        End Try
                    Next
                    Backupfolder1.Add(NFN.DirectoryName)
                    MDiMain.MSG(NFN.DirectoryName & "폴더 백업완료.")
                    MDiMain.Refresh()
                End If
            Case E_baktype.ParentFolder  '//해당파일이 발견된 폴더의 상위폴더를 생성 폳러명 위 참조
                NewFn = fn.Directory.FullName & tag & "\" & fn.Name  '//상위폴더에 생성
                NFN = New FileInfo(NewFn)
                If ExistBakFolder1(NFN.DirectoryName) = False Then
                    MDiMain.MSG(NFN.DirectoryName & "폴더 백업중...")
                    MDiMain.Refresh()
                    addlog("B", fn.FullName, NFN.FullName, "폴더백업(정책1-상위폴더)")
                    '//원본폴더의 모든 내용을 복사해논다.
                    Directory.CreateDirectory(NFN.DirectoryName)  '//디렉토리생성
                    FL = New DirectoryInfo(fn.DirectoryName).GetFiles("*.*", SearchOption.AllDirectories)
                    Dim index As Integer = 0
                    Dim endcnt As Integer = FL.Length
                    For Each F As FileInfo In FL
                        index += 1
                        MDiMain.ShowCnt2(index, endcnt, "백업")
                        My.Application.DoEvents()
                        Try
                            F.CopyTo(NFN.DirectoryName & "\" & F.Name, True)   '//새로운경로로 복사를 한다.
                        Catch ex As System.IO.DirectoryNotFoundException
                            Dim B As New System.IO.FileInfo(NFN.DirectoryName & "\" & F.Name)
                            System.IO.Directory.CreateDirectory(B.DirectoryName)
                            B = Nothing
                            F.CopyTo(NFN.DirectoryName & "\" & F.Name, True)   '//새로운경로로 복사를 한다.
                        Catch ex As Exception
                            MsgBox("파일복사오류 : " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "확인")
                        End Try
                    Next
                    Backupfolder1.Add(NFN.DirectoryName)
                    MDiMain.MSG(NFN.DirectoryName & "폴더 백업완료.")
                    MDiMain.Refresh()
                End If
        End Select
    End Sub
    
   
End Module
