495 lines
21 KiB
VB.net
495 lines
21 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
|
|
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(GetWorkDIr.Length)))
|
|
NR.대상경로 = DesFile.DirectoryName
|
|
Catch ex As Exception
|
|
NR.대상경로 = ""
|
|
NR.오류 += ex.Message
|
|
End Try
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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
|