Files
FileManager/DriveInfo/모듈/Mod_Move.vb
2021-12-27 22:20:25 +09:00

321 lines
14 KiB
VB.net

Imports System.IO
Imports System.Threading
Imports System.Text
Module Mod_Move '//파일이동 모듈파일
Public Sub MoveFileM(Param As RunParam) '//파일목록으로부터 삭제대상폴더의 파일을 삭제한다.
Dim StrBuff As New StringBuilder
Dim WorkDes As String = IIf(GetrunType() = E_Runtype.Move, "이동", "복사")
'//작업목록을 작성합니다.
MDiMain.MSG(WorkDes & "목록 작성중.")
'//변수목록
Dim NR As ireaDataSet.WorkListRow
Dim WRow() As ireaDataSet.FileListRow
Dim DesDir As DirectoryInfo
Dim DesFile As FileInfo
Dim SrcOffset As Long = 0 '//원본목록에서의 레코드위치(대상파일을 생성하려면 줄번호를 기억해야한다.)
Dim index As Integer = 0
Dim endcnt As Integer = MDiMain.DataSet1.SrcList.Rows.Count - 1
If MDiMain.DataSet1.SrcList Is Nothing Then
MsgBox("원본목록이 존재하지않습니다." & vbCrLf & "진행할 수 없습니다", MsgBoxStyle.Information, "확인")
Return
End If
For Each drs As ireaDataSet.SrcListRow In MDiMain.DataSet1.SrcList.Rows
If MDiMain.DataSet1.FileList Is Nothing Then
MsgBox("파일목록이 존재하지않습니다." & vbCrLf & "진행할 수 없습니다", MsgBoxStyle.Information, "확인")
Return
End If
index += 1
MDiMain.ShowCnt1(index, endcnt, "목록작성")
Application.DoEvents()
'//전체목록에서 원본목록 검색
Try
WRow = MDiMain.DataSet1.FileList.Select("파일명 like '" & drs.목록명.Replace("'", "''") & "'") '//170410 홑따옴표 처리 및 오류처리기능 추가
Catch ex As Exception
'//오류가 발생했으므로 오류로 기록하고 넘긴다.
WRow = Nothing
NR = MDiMain.DataSet1.WorkList.NewWorkListRow
NR.원본경로 = String.Empty
NR.원본파일명 = drs.목록명
Select Case GetrunType()
Case E_Runtype.Copy
NR.구분 = "복사"
Case E_Runtype.Delete
NR.구분 = "삭제"
Case E_Runtype.Move
NR.구분 = "이동"
End Select
NR.대상경로 = String.Empty
NR.대상파일명 = String.Empty
NR.오류 = "파일추출실패:" + ex.Message
Try
MDiMain.DataSet1.WorkList.Rows.Add(NR)
Catch ex2 As Exception '//추가오류는 뻔하다이미 그 파일이 있는경우다.
Continue For
End Try
End Try
SrcOffset = index + getSP() - 1 '//줄시작값과 현재의 오프셋을 더한다.
Dim loopcnt2 As Integer = 0
Dim 작업폴더 As String = GetWorkDIr().Replace("ftp:", "").Replace("FTP:", "")
For Each dr As ireaDataSet.FileListRow In WRow
NR = MDiMain.DataSet1.WorkList.NewWorkListRow
NR.원본경로 = dr.경로
NR.원본파일명 = dr.파일명
Select Case GetrunType()
Case E_Runtype.Copy
NR.구분 = "복사"
Case E_Runtype.Delete
NR.구분 = "삭제"
Case E_Runtype.Move
NR.구분 = "이동"
End Select
loopcnt2 += 1
Application.DoEvents()
'//검색된것들은 이동또는 복사대상이므로 작업목록에 집어넣는다.
'//대상파일명을 생성한다.
NR.오류 = ""
Try
DesDir = New DirectoryInfo(MDiMain.DESD_GetDesDir(SrcOffset, dr.파일명.Substring(0, dr.파일명.LastIndexOf(".")), GetExtendOnly, dr.경로.Substring(작업폴더.Length)))
NR.대상경로 = DesDir.FullName '//수정함
Catch ex As Exception
NR.대상경로 = ""
NR.오류 += ex.Message
End Try
If String.IsNullOrEmpty(NR.대상경로) = False Then
Try
DesFile = New FileInfo(DesDir.FullName & "\" & MDiMain.Desf_Get_FileList(SrcOffset, dr.파일명.Substring(0, dr.파일명.LastIndexOf(".")), GetExtendOnly) & Pub.GetExtendFromMdi.Trim("*"))
NR.대상파일명 = DesFile.Name
Catch ex As Exception
NR.대상파일명 = ""
NR.오류 += ex.Message
End Try
End If
If NR.오류 <> "" Then
'//이미오류가 발생했다.
Try
MDiMain.DataSet1.WorkList.Rows.Add(NR)
Catch ex As Exception '//추가오류는 뻔하다이미 그 파일이 있는경우다.
End Try
Else
If DesFile.Name.IndexOf("*") = -1 AndAlso DesFile.Name.IndexOf("?") = -1 Then
Try
MDiMain.DataSet1.WorkList.Rows.Add(NR)
Catch ex As Exception '//추가오류는 뻔하다이미 그 파일이 있는경우다.
NR.오류 += ",중복된 대상파일입니다(" & ex.Message.ToString & ")"
'MDiMain.DataSet1.WorkList.Rows.Add(NR)
makelog2("중복된 대상파일이 생성되었습니다")
makelog2(" 원본파일명 : " & NR.원본경로 & "\" & NR.원본파일명)
makelog2(" 대상파일명 : " & NR.대상경로 & "\" & NR.대상파일명)
'If MsgBox("중복된 대상파일이 확인되었습니다" & vbCrLf & vbCrLf & "계속하시겠습니까?", MsgBoxStyle.Information Or MsgBoxStyle.OkCancel, "확인") <> MsgBoxResult.Ok Then
' Return
'End If
End Try
End If
End If
Application.DoEvents()
Next
Next
MDiMain.MSG(WorkDes & "목록 작성완료.")
MDiMain.MSG(WorkDes & "연속참조 검사")
index = 0
Dim Rc As Integer = MDiMain.DataSet1.WorkList.Rows.Count
Dim 원본파일명, 원본경로, 대상파일명, 대상경로 As String
Dim 시퀀스 As Integer
Dim Findrow As Boolean = False
Application.DoEvents()
For Each dr As ireaDataSet.WorkListRow In MDiMain.DataSet1.WorkList.Rows
Findrow = False
index += 1
MDiMain.ShowCnt1(index, Rc, "연속참조검사")
원본파일명 = dr.원본파일명
원본경로 = dr.원본경로
대상파일명 = dr.대상파일명
대상경로 = dr.대상경로
시퀀스 = dr.seq
Application.DoEvents()
If 원본파일명 <> "" Then
Dim dr2() As ireaDataSet.WorkListRow = MDiMain.DataSet1.WorkList.Select("대상파일명='" & 원본파일명 & "' and 대상경로='" & 원본경로 & "' and seq <> " & 시퀀스)
For Each Drow2 As ireaDataSet.WorkListRow In dr2
Findrow = True
Drow2.성공 = ""
Drow2.오류 = "연속참조오류:" & index
Next
If Findrow Then
dr.성공 = ""
dr.오류 = "연속참조오류"
End If
End If
If 대상파일명 <> "" Then
Dim dr2() As ireaDataSet.WorkListRow = MDiMain.DataSet1.WorkList.Select("원본파일명='" & 대상파일명 & "' and 원본경로='" & 대상경로 & "' and seq <> " & 시퀀스)
For Each Drow2 As ireaDataSet.WorkListRow In dr2
Findrow = True
Drow2.성공 = ""
Drow2.오류 = "연속참조오류:" & index
Next
If Findrow Then
dr.성공 = ""
dr.오류 = "연속참조오류"
End If
End If
Next
Application.DoEvents()
'//오류를 제외한 실제 처리할 내용을 리스트뷰에 넣는다
'//작업대상을 지정해준다.
Dim 작업갯수 As Integer = 0
Dim DRows() As System.Data.DataRow = MDiMain.DataSet1.WorkList.Select("isnull(오류,'')=''")
MDiMain.AddScheduleDiv(" " + DRows.Length.ToString() + " 개의 작업대상이 설정되었습니다")
Dim loopcnt As Integer = 0
For Each dr As ireaDataSet.WorkListRow In DRows
Dim lvKey As String = dr.대상경로 + "\" + dr.대상파일명
Dim 원본파일 As String = dr.원본경로 + "\" + dr.원본파일명
Dim 대상파일 As String = dr.대상경로 + "\" + dr.대상파일명
If Param.isFTPWork Then
원본파일 = 원본파일.Replace("\", "/")
대상파일 = 대상파일.Replace("\", "/")
End If
loopcnt += 1
Application.DoEvents()
'If MDiMain.lvSchedule.Items.IndexOfKey(lvKey) = -1 Then
' 작업갯수 += 1
' Dim lvSC As ListViewItem = MDiMain.lvSchedule.Items.Add(lvKey, dr.구분, 0)
' lvSC.SubItems.Add(원본파일)
' lvSC.SubItems.Add(대상파일)
' lvSC.SubItems.Add("대기")
' lvSC.SubItems.Add(작업갯수.ToString())
' lvSC.ForeColor = Color.DarkMagenta
' '//명령파라미터추가
' 'Dim NewCmd As New SJobCommand()
' 'Select Case dr.구분
' ' Case "복사"
' ' NewCmd.Mode = E_Runtype.Copy
' ' Case "삭제"
' ' NewCmd.Mode = E_Runtype.Delete
' ' Case "이동"
' ' NewCmd.Mode = E_Runtype.Move
' 'End Select
' 'NewCmd.SrcDir = dr.원본경로
' 'NewCmd.SrcFile = dr.원본파일명
' 'NewCmd.DesDir = dr.대상경로
' 'NewCmd.DesFile = dr.대상파일명
' 'NewCmd.isFTP = Param.isFTPWork
' 'lvSC.Tag = NewCmd
'Else
' PLog.Add("중복대상파일:" + lvKey)
'End If
Next
End Sub
Public Sub MoveFileRMove(winhide As Boolean)
Dim SrcFI, DesFi As FileInfo
Dim Errcount As Integer = 0
MDiMain.MSG("파일이동중...")
Dim index As Integer = 0
Dim endcnt As Integer = MDiMain.DataSet1.WorkList.Rows.Count - 1
If MDiMain.DataSet1.WorkList Is Nothing Then
MsgBox("작업파일목록이 존재하지않습니다." & vbCrLf & "진행할 수 없습니다", MsgBoxStyle.Information, "확인")
Return
End If
For Each Dr As ireaDataSet.WorkListRow In MDiMain.DataSet1.WorkList.Rows
index += 1
MDiMain.ShowCnt1(index, endcnt, "파일이동")
My.Application.DoEvents()
If Dr.오류 <> "" Then
Errlog("선오류감지되어서 넘어갑니다(" & Dr.오류 & ")")
Errcount += 1
Else
Dim 원본파일명 As String = Dr.원본경로 & "\" & Dr.원본파일명
Dim 대상파일명 As String = Dr.대상경로 & "\" & Dr.대상파일명
If Not isFileName(원본파일명) Then
Dr.성공 = "X"
Dr.오류 = "원본파일명이 올바르지 않습니다:" + 원본파일명
ElseIf Not isFileName(대상파일명) Then
Dr.성공 = "X"
Dr.오류 = "대상파일명이 올바르지 않습니다:" + 대상파일명
Else
SrcFI = New System.IO.FileInfo(원본파일명)
DesFi = New System.IO.FileInfo(대상파일명)
Try
Check_Backup(SrcFI, BakTag)
Catch ex As Exception
MsgBox("백업정책(Check_Backup이 실패했습니다)" & vbCrLf & "Baktag=" & BakTag & vbCrLf & "오류내용:" & ex.Message.ToString, MsgBoxStyle.Information, "메일보내주세요")
End Try
Application.DoEvents()
'//폴더생성시 오류가 발생할수있다.
If Not System.IO.Directory.Exists(Dr.대상경로) Then
If Not DirCreate(Dr.대상경로) Then
Dr.성공 = "X"
Dr.오류 = "대상폴더생성실패:" + Dr.대상경로
Errcount += 1
Continue For
End If
End If
Application.DoEvents()
Try
'//대상파일이존재한다면 넘어가도록 한다.
If DesFi.Exists AndAlso DesFi.Length = SrcFI.Length Then
Dr.성공 = ""
Dr.오류 = "대상파일존재 넘어감"
'DesFi.Delete() '//덮어쓰기이므로 기존파일을 삭제해주심!
Else
SrcFI.MoveTo(DesFi.FullName) '//실제로 이동한다.
Dr.성공 = "O"
Dr.오류 = ""
End If
Catch ex As Exception
Dr.성공 = "X"
Dr.오류 = "MFRM:" + ex.Message.ToString
Errcount += 1
End Try
Application.DoEvents()
End If
End If
Next
MDiMain.MSG("파일 [이동] 완료" & IIf(Errcount > 0, "(일부파일에 오류가 발생하였습니다", ""))
End Sub
End Module