Module Job '//작업을 이어서하는 지 플래그 Private Bw As System.Threading.Thread Structure RunParam Dim StartP As Integer Dim EndP As Integer Dim WorkDir As String Dim Replay As Boolean Dim isCopy As Boolean '//복사작업인가? Dim 원본폴더조합 As Boolean Dim 확장자 As String Public ReadOnly Property isFTPWork As Boolean Get If WorkDir.StartsWith("ftp:") Then Return True Else Return False End If End Get End Property End Structure Public Function Run(Param As RunParam) As Boolean PLog.Add("작업시작", True) '//일반 초기화 PLog.Add("시스템초기화") Log = New ArrayList() log2 = New ArrayList() Backupfolder1.Clear() '//기존의 백업폴더명을 삭제한다. (새로쓰기위해서) '//원본폴더조합기능이 켜져있는경우 If Param.원본폴더조합 Then MDiMain.MSG("원본폴더조합시작") MDiMain.SubDirListCler() '//기존목록은 초기화한다. '//작업순서에 포함시킨다. Dim lv As ListViewItem = MDiMain.lvSchedule.Items.Add("폴더조합") lv.SubItems.Add("원본") lv.SubItems.Add("지정된 목록으로부터 하위폴더명을 추출합니다.") lv.SubItems.Add("대기") lv.SubItems.Add("-") MDiMain.lvSchedule.Refresh() MDiMain.Noti("하위폴더조합 실행") '//이어하기 작업이 설정되어있다면? Dim 체크섬 As String = "" If Not Prev_file Is Nothing Then 체크섬 = FileCheckSum(Prev_file.FullName) End If Dim jobfile As String = String.Format("{0}\{1}_{2}_{3}_{4}_{5}.job", PathJob, Prev_file.Name, Prev_file.Length, Param.StartP, Param.EndP, 체크섬) Dim 폴더조합불러오기성공 As Boolean = False If Param.Replay Then '//원본폴더조합기능은 직접편집이아니고 불러온 파일명과 해당 파일의 크기가 동일한 기록이 있다면 그것을 이용한다 If Not Prev_file Is Nothing AndAlso Prev_file.Exists Then If System.IO.File.Exists(jobfile) Then '//동일한 내역을 가진 job 파일이 있으므로 그것을 이용하도록 한다 Dim fi As New System.IO.FileInfo(jobfile) If fi.Length > 0 Then Try Dim buffer As String = System.IO.File.ReadAllText(jobfile) For Each line As String In buffer.Split(vbCrLf) If String.IsNullOrEmpty(line) Then Continue For MDiMain.AddSubDirList(line.Trim()) Next 폴더조합불러오기성공 = True '//현재상태 lv.SubItems(2).Text = String.Format("{0}건 의 하위폴더가 설정됨", MDiMain.SubDirCount) lv.SubItems(3).Text = "통과" lv.BackColor = Color.LightSkyBlue MDiMain.lvSchedule.Refresh() Catch ex As Exception PLog.Add("폴더조합불러오기오류 : " + ex.Message) End Try End If End If End If End If If Not 폴더조합불러오기성공 Then '//새로 생성한다. '//프로그레스바 초기화 MDiMain.ProgressSet(Param.EndP, Param.StartP, Param.StartP) '//수량 표시 MDiMain.ShowCnt1(Param.StartP, Param.EndP) Dim rcnt As Integer = Param.EndP - Param.StartP + 1 PLog.Add(String.Format("원본폴더 조합기능 시작({0})", rcnt)) '//현재작업을 저장해준다 Dim JobFileBuf As New System.Text.StringBuilder For i As Integer = Param.StartP To Param.EndP MDiMain.ProgressVal(i) '//작업진행사항을 표시해준다. lv.SubItems(3).Text = String.Format("{0}/{1}", i, Param.EndP) MDiMain.lvSchedule.Refresh() Dim subdir As String = MDiMain.srcd_Get_FileList(i, "", Param.확장자).ToString If subdir = "/" OrElse subdir = "\" OrElse subdir.ToLower().IndexOf("err") <> -1 Then Continue For If Not MDiMain.CheckExistSubDir(subdir) Then MDiMain.AddSubDirList(subdir) '//존재하는 항목은 추가되지 않는다. JobFileBuf.AppendLine(subdir) End If Application.DoEvents() Next '//현재상태 lv.SubItems(3).Text = "완료" lv.BackColor = Color.LightGreen MDiMain.lvSchedule.Refresh() '//완료목록을 저장해준다. System.IO.File.WriteAllText(jobfile, JobFileBuf.ToString()) End If End If '//중간분리자 MDiMain.AddScheduleDiv("파일목록 수집") '//파일정보수집 MDiMain.MSG("파일정보수집") '//서브목록이있다면 그것들만 수집힌다. Dim fullsubdir As String Dim 재시도 As Boolean = False retryFileSearch: '//폴더내의 파일목록을 수집한다. Dim 수집오류 As Boolean = False If MDiMain.HasSubDir Then '//서브목록이 있다면 '//프로그레스 설정과 현재 수량 표시 MDiMain.ProgressSet(MDiMain.SubDirCount, 0, 0) For i As Integer = 1 To MDiMain.SubDirCount MDiMain.ShowCnt1(i, MDiMain.SubDirCount) MDiMain.ProgressVal(i) Dim lvSubDir As ListViewItem = MDiMain.list_subdir.Items(i - 1) fullsubdir = CStr(GetWorkDIr() & "\" & lvSubDir.Text).Replace("\\", "\") '//대상폴더가 FTP람녀 폴더구분기호를 \ 에서 / 로 변경해야한다. If Param.isFTPWork Then fullsubdir = fullsubdir.Replace("\", "/") Dim lvitem As ListViewItem = MDiMain.lvSchedule.Items.Add("검색") lvitem.SubItems.Add(fullsubdir) lvitem.SubItems.Add("파일목록을 작성합니다.") lvitem.SubItems.Add("대기") lvitem.SubItems.Add("-") MDiMain.lvSchedule.Refresh() Application.DoEvents() MDiMain.Noti("폴더검색" + vbCrLf + fullsubdir) If 재시도 AndAlso lvSubDir.ForeColor <> Color.Red Then '//재시도이므로 처리하지 않는다 PLog.Add("재시도작업이므로 확인개체는 처리하지 않습니다(" + lvSubDir.Text + ")") Continue For End If '//FTP가 대상일경우에는 별도 처리를 한다. If Param.isFTPWork Then fullsubdir = fullsubdir.Replace("\", "/") Dim ermsg As String = "" Dim fnotfound As Boolean = False Dim filecount As Integer = 0 Dim RetryCount As Integer = 0 RETRYFTP: RetryCount += 1 If Not SearchFTP(Param, lvitem, fullsubdir, ermsg, fnotfound, filecount) Then If Not fnotfound Then '//오류가 발생했다면 3회정도 재시도를 한다. If RetryCount <= MaxRetryCount Then lvitem.ForeColor = Color.DarkMagenta lvitem.SubItems(3).Text = String.Format("{0}/{1}", RetryCount, MaxRetryCount) MDiMain.lvSchedule.Refresh() PLog.Add(String.Format("재시도를 위해서 다음 시간을 기다림 : {0}ms", RetrySleeptime)) Threading.Thread.Sleep(RetrySleeptime) Application.DoEvents() GoTo RETRYFTP Else lvitem.ForeColor = Color.White lvitem.BackColor = Color.DarkRed lvitem.SubItems(3).Text = "오류" MDiMain.lvSchedule.Refresh() Application.DoEvents() End If End If End If Else SearchDir(Param, New DirectoryInfo(fullsubdir)) Application.DoEvents() End If '//delay Threading.Thread.Sleep(1000) Next Else '//없으면 지정된 목록을 기준으로 잡는다 'MsgBox("dirinfo" & New DirectoryInfo(GetWorkDIr).FullName) If Param.WorkDir.StartsWith("ftp:/") Then Dim ermsg As String = "" Dim fnotfound As Boolean = False Dim filecount As Integer = 0 Dim lvitem As ListViewItem = MDiMain.lvSchedule.Items.Add("검색") lvitem.SubItems.Add(Param.WorkDir) lvitem.SubItems.Add("FTP 파일명수집") lvitem.SubItems.Add("대기") lvitem.SubItems.Add("-") MDiMain.Noti("폴더검색" + vbCrLf + Param.WorkDir) Application.DoEvents() If Not SearchFTP(Param, lvitem, GetWorkDIr, ermsg, fnotfound, filecount) Then MsgBox("FTP경로조회가 실패되었습니다" + vbCrLf + ermsg, MsgBoxStyle.Critical, "확인") Else Log.Add("FTP 파일조회성공 : " + Param.WorkDir + ":" + filecount.ToString()) End If Else Dim lvitem As ListViewItem = MDiMain.lvSchedule.Items.Add("검색") lvitem.SubItems.Add(Param.WorkDir) lvitem.SubItems.Add("파일명수집") lvitem.SubItems.Add("대기") lvitem.SubItems.Add("-") MDiMain.lvSchedule.Refresh() Application.DoEvents() SearchDir(Param, New DirectoryInfo(Param.WorkDir)) End If End If If 수집오류 Then If MsgBox("파일목록 수집오류가 발생하였습니다 " + vbCrLf + "다시시도 하시겠습니까?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "확인") = MsgBoxResult.Yes Then 재시도 = True GoTo retryFileSearch Else MsgBox("현재목록을 가지고 진행합니다", MsgBoxStyle.Information, "확인") End If End If Addlog2("전체 그림파일 수 : " & MDiMain.DataSet1.FileList.Rows.Count & "개") PLog.Add(String.Format("Total Image Count : {0}", MDiMain.DataSet1.FileList.Rows.Count)) If MDiMain.DataSet1.FileList.Rows.Count = 0 Then '//목록이 하나도없다 MsgBox("지정된 작업폴더내에 가능한 그림파일이 존재하지않습니다" & vbCrLf & "더이상 진행을 할 수 없습니다", MsgBoxStyle.Critical, "확인") Return False End If '//중간분리자 MDiMain.AddScheduleDiv("원본목록 작성") Application.DoEvents() '//원본목록작성 MDiMain.MSG("원본목록 작성") Dim SrcTxt As String Dim StartIndex As Integer = getSP() PLog.Add(String.Format("Make SourceList Range {0}~{1}", StartIndex, Ep)) MDiMain.Noti("원본목록작성") For i As Integer = StartIndex To Ep MDiMain.ShowCnt1(i, Ep, "원본목록 작성중") SrcTxt = MDiMain.Get_SrcFileList(i + 1) If SrcTxt <> "" AndAlso SrcTxt <> "*" And SrcTxt <> "?" Then MDiMain.DataSet1.SrcList.Rows.Add(New String() {SrcTxt}) End If Application.DoEvents() Next Addlog2("원본목록 수 : " & MDiMain.DataSet1.SrcList.Rows.Count & "개") PLog.Add(String.Format("Source List Count ={0}", MDiMain.DataSet1.SrcList.Count)) '//중간분리자 MDiMain.AddScheduleDiv("작업목록 작성") Application.DoEvents() '//이제 원본목록을 파일목로에서 검색한다. 데이터테이블의 Like 를 이요하면된다. '//그리고 검색된것들은 worklist 로보낸다. MDiMain.Noti("작업목록 작성") If GetrunType() = E_Runtype.Delete Then DeleteFileM(Param) Application.DoEvents() Else MoveFileM(Param) Application.DoEvents() End If Addlog2("작업목록 : " & MDiMain.DataSet1.WorkList.Rows.Count & "개") Return True End Function ''' ''' 지정된 FTP로부터 파일목록을 수신한다 ''' ''' ''' Public Function SearchFTP(ByRef Param As RunParam, ByRef lvitem As ListViewItem, ByVal Di As String, ByRef erMsg As String, ByRef NotFound As Boolean, ByRef filecnt As Integer) As Boolean Di = Di.Replace("ftp:/", "").Replace("//", "/") If Not Di.StartsWith("/") Then Di = "/" + Di If Di.EndsWith("/") Then Di = Di.Substring(0, Di.Length - 1) If Di.IndexOf("-원본") = -1 Then PLog.Add(String.Format("FTP 목록조회 : {0}", Di)) '//FTP캐쉬폴더가 있다면 그것을 사용한다.(우선은 파일목록에대한 작업이다) Dim CacheDirName As String = PathJob + "\" + FTPServer + "\" + Di.Replace("/", "\") + "\summary.txt" CacheDirName = CacheDirName.Replace("\\", "\") '//수집된파일목록 Dim filelist As New List(Of String) Dim SubDirList As New List(Of String) Dim 이어하기 As Boolean = False '//파일목록수집(기존정보의 사용이 허가된 경우 캐쉬파일에서 정보를 읽는다 If Param.Replay AndAlso System.IO.File.Exists(CacheDirName) Then Dim SumFile As New ArinSetting.ArinSetting(CacheDirName) Dim 파일목록 As String = SumFile.Data("file", "list") For Each 파일 As String In 파일목록.Split(",") If String.IsNullOrEmpty(파일) Then Continue For If filelist.IndexOf(파일) = -1 Then filelist.Add(파일) Next Application.DoEvents() Dim 하위폴더목록 As String = SumFile.Data("subdir", "list") For Each 파일 As String In 하위폴더목록.Split(",") If String.IsNullOrEmpty(파일) Then Continue For If SubDirList.IndexOf(파일) = -1 Then SubDirList.Add(파일) Next If filelist.Count > 0 Then 이어하기 = True Application.DoEvents() End If '//파일목록이 불러와진게 없다면 FTP에서 조회를 시작한다. If filelist.Count < 1 Then Dim isErr As Boolean = False Dim ErrMsg As String = "" Dim dirlist As FTPClients.FTPdirectory Try dirlist = FTP_0.ListDirectoryDetail(Di) Catch exw As System.Net.WebException If TypeOf (exw.Response) Is System.Net.FtpWebResponse Then PLog.Add("FTP목록조회오류(WEBEX) : " + exw.Message, True) Dim ftpdesc As String = CType(exw.Response, System.Net.FtpWebResponse).StatusDescription If ftpdesc.ToLower.IndexOf("directory not found") <> -1 Then PLog.Add("폴더없음 오류코드이므로 정상 처리로 한다", True) NotFound = True erMsg = ftpdesc lvitem.SubItems(2).Text = "폴더가 존재하지 않습니다" lvitem.SubItems(3).Text = "완료" lvitem.BackColor = Color.White '//성공했다 lvitem.ForeColor = Color.DimGray Return False Else erMsg = exw.Message lvitem.SubItems(2).Text = exw.Message lvitem.SubItems(3).Text = "오류" lvitem.BackColor = Color.Red lvitem.ForeColor = Color.White Return False End If Else PLog.Add("FTP목록조회오류(WEBEX-2) : " + exw.Message, True) erMsg = exw.Message lvitem.SubItems(2).Text = exw.Message lvitem.SubItems(3).Text = "오류" lvitem.BackColor = Color.Red lvitem.ForeColor = Color.White Return False End If Catch ex As Exception PLog.Add("FTP목록조회오류(기타) : " + ex.Message, True) erMsg = ex.Message lvitem.SubItems(2).Text = ex.Message lvitem.SubItems(3).Text = "오류" lvitem.BackColor = Color.Red lvitem.ForeColor = Color.White Return False End Try Application.DoEvents() '//파일목록을 저장해서 캐쉬로사용하도록 한다. Dim sb_FileList As New System.Text.StringBuilder Dim fcnt1 As UInteger = 0 For Each info As FTPClients.FTPfileInfo In dirlist.GetFiles(Param.확장자) If info.FileType <> FTPClients.FTPfileInfo.DirectoryEntryTypes.File Then Continue For fcnt1 += 1 sb_FileList.Append("," + info.Filename) filelist.Add(info.Filename) '//If filelist.Count Mod 50 = 0 Then Application.DoEvents() '//160831 '//End If Next ''//ftp에러 오류없이 처리되었따 'lvitem.ForeColor = Color.Black 'lvitem.SubItems(2).Text = fcnt1.ToString() 'lvitem.SubItems(3).Text = "완료" 'If fcnt1 < 1 Then ' lvitem.BackColor = Color.WhiteSmoke '//성공했지만 파일은 없었다 'Else ' lvitem.BackColor = Color.LightGreen '//성공했다 'End If '//캐쉬파일을 생성해준다. 160716 Dim fiCache As New System.IO.FileInfo(CacheDirName) If Not fiCache.Directory.Exists Then fiCache.Directory.Create() Dim summary As New ArinSetting.ArinSetting(fiCache.FullName) If Not summary.Exist Then summary.CreateFile() summary.Data("file", "count", "") = fcnt1.ToString() summary.Data("file", "list", "") = sb_FileList.ToString() Application.DoEvents() Dim foldlist2 As New System.Text.StringBuilder For Each info As FTPClients.FTPfileInfo In dirlist.GetDirectories SubDirList.Add(info.NameOnly) foldlist2.Append("," + info.NameOnly) Next '//하위목록도 저장해준다. summary.Data("subdir", "count", "") = SubDirList.Count.ToString() summary.Data("subdir", "list", "") = foldlist2.ToString() summary.Save() Application.DoEvents() End If '//수집된 파일목록을 데이터테이블에 기록한다. Dim fcnt As Integer = 0 For Each File As String In filelist fcnt += 1 MDiMain.MSG(MDiMain.DataSet1.FileList.Rows.Count & "개의 파일정보를 수집했습니다") MDiMain.DataSet1.FileList.Rows.Add(New String() {Di, File}) Application.DoEvents() Next filecnt += fcnt lvitem.SubItems(2).Text = String.Format("{0}", fcnt) If 이어하기 Then lvitem.SubItems(3).Text = "통과" lvitem.BackColor = Color.LightSkyBlue Else lvitem.SubItems(3).Text = "완료" lvitem.BackColor = Color.LightGreen '//성공했다 End If If fcnt = 0 Then lvitem.ForeColor = Color.Gray Else lvitem.ForeColor = Color.Black End If PLog.Add(String.Format("폴더검색결과({0}) 파일={1},폴더={2}", Di, filelist.Count, SubDirList.Count)) MDiMain.MSG(MDiMain.DataSet1.FileList.Rows.Count & "개의 파일정보를 수집했습니다") Application.DoEvents() '//해당폴더의 서브폴더를 체크하도록 하였다면? If GetSubDir() Then '//여기서 폴더정보를 다시 수집한다. For Each DD As String In SubDirList Dim subpath As String = Di + "/" + DD subpath = subpath.Replace("//", "/") subpath = subpath.Replace("\", "/") PLog.Add(String.Format("Entering Subdir : {0}", subpath)) Dim fnotfound As Boolean Dim filecount As Integer Dim lvitemS As ListViewItem = MDiMain.lvSchedule.Items.Add("검색") lvitemS.SubItems.Add(subpath) lvitemS.SubItems.Add("FTP 파일명수집") lvitemS.SubItems.Add("대기") lvitemS.SubItems.Add("-") MDiMain.lvSchedule.Refresh() Application.DoEvents() Dim RetryCount As Integer = 0 RETRYFTP: If Not SearchFTP(Param, lvitemS, subpath, erMsg, fnotfound, filecount) Then If Not fnotfound Then '//오류가발생했지만 오류내용이 없다는 오류이다.(정상처리해야함) If RetryCount <= MaxRetryCount Then lvitem.ForeColor = Color.DarkMagenta lvitem.SubItems(3).Text = String.Format("{0}/{1}", RetryCount, MaxRetryCount) MDiMain.lvSchedule.Refresh() PLog.Add(String.Format("재시도를 위해서 다음 시간을 기다림 : {0}ms", RetrySleeptime)) Threading.Thread.Sleep(RetrySleeptime) Application.DoEvents() GoTo RETRYFTP Else lvitem.ForeColor = Color.White lvitem.BackColor = Color.DarkRed lvitem.SubItems(3).Text = "오류" MDiMain.lvSchedule.Refresh() Application.DoEvents() End If End If End If Next End If Else PLog.Add("SearchFTP Skip : " + Di) End If Return True End Function ''' ''' 해당디렉토리로부터 파일정보를 수집한다 ''' ''' ''' Public Function SearchDir(ByRef Param As RunParam, ByVal Di As DirectoryInfo) As Boolean If Di.Exists = False Then PLog.Add("폴더내파일검색 : 폴더없음 : " + Di.FullName, True) Return False End If If Di.FullName.IndexOf("-원본") = -1 Then PLog.Add("폴더내 파일검색 : " + Di.FullName) Try Dim FI() As FileInfo = Di.GetFiles("*." + Param.확장자) For Each F As FileInfo In FI MDiMain.MSG(MDiMain.DataSet1.FileList.Rows.Count & "개의 파일정보를 수집했습니다") MDiMain.DataSet1.FileList.Rows.Add(New String() {F.DirectoryName, F.Name}) Application.DoEvents() Next Application.DoEvents() If GetSubDir() Then For Each DD As DirectoryInfo In Di.GetDirectories SearchDir(Param, DD) Next End If Return True Catch ex As Exception MsgBox("폴더정보를 불러오는데 실패했습니다" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Information, "확인") Return False End Try Else PLog.Add("폴더내파일검색 : 원본폴더로인한 통과 : " + Di.FullName, True) Return False End If End Function End Module