FileManager_Runtime_1704102200_Net4

This commit is contained in:
Chikyun
2019-08-04 20:13:56 +09:00
commit 6b10d3e460
100 changed files with 16893 additions and 0 deletions

568
DriveInfo/모듈/Job.vb Normal file
View File

@@ -0,0 +1,568 @@
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
''' <summary>
''' 지정된 FTP로부터 파일목록을 수신한다
''' </summary>
''' <param name="Di"></param>
''' <remarks></remarks>
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
''' <summary>
''' 해당디렉토리로부터 파일정보를 수집한다
''' </summary>
''' <param name="Di"></param>
''' <remarks></remarks>
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

View File

@@ -0,0 +1,182 @@
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

View File

@@ -0,0 +1,494 @@
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

330
DriveInfo/모듈/Pub.vb Normal file
View File

@@ -0,0 +1,330 @@
Imports System.Data
Module Pub
Structure Str_Macro
Dim FileName As String
Dim Desc As String
End Structure
'//일반변수
Public PLog As ArinLog.ArinLog
Public PathTempDown As String
Public PathMacro As String
Public PathJob As String
Public PathList As String
Public MacroPattern As String = "fileinfo"
Public IniFile As String
Public Prev_file As System.IO.FileInfo
Public MaxRetryCount As Integer = 20 '//ftp 재시도 횟수 (10회 재시도 후 실패시에는 우선 넘어간다)
Public RetrySleeptime As Integer = 2000
'//FTP변수
Public FTPServer As String = "127.0.0.1"
Public FTPID As String = "anonymous"
Public FTPPW As String = ""
Public FTPPort As Integer = 21
Public FTPPath As String = ""
Public FTPPassive As Boolean = False
Public FTPUTF8 As Boolean = False
Public Enum EJobCmdType
copy = 0
move = 1
delete = 2
End Enum
Public Structure SJobCommand
Dim Mode As E_Runtype
Dim SrcDir As String
Dim SrcFile As String
Dim DesDir As String
Dim DesFile As String
Dim isFTP As Boolean
End Structure
Public Function FileCheckSum(fn As String) As String
Dim _md5 As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create()
Using stream As System.IO.FileStream = File.OpenRead(fn)
Dim checksum() As Byte = _md5.ComputeHash(stream)
Return BitConverter.ToString(checksum).Replace("-", String.Empty)
End Using
Return "CHKERR"
End Function
Public Sub init()
'//공용로그값
PLog = New ArinLog.ArinLog()
'//공용변수
Prev_file = Nothing
'//기본경로
PathMacro = My.Application.Info.DirectoryPath & "\macro\" & MacroPattern
PathJob = My.Application.Info.DirectoryPath & "\Job"
PathList = My.Application.Info.DirectoryPath & "\List"
'//작업용폴더확인
If Not System.IO.Directory.Exists(PathJob) Then System.IO.Directory.CreateDirectory(PathJob)
If Not System.IO.Directory.Exists(PathMacro) Then System.IO.Directory.CreateDirectory(PathMacro)
If Not System.IO.Directory.Exists(PathList) Then System.IO.Directory.CreateDirectory(PathList)
'//파일변수
IniFile = My.Application.Info.DirectoryPath & "\macro\" & MacroPattern & "\default.ini"
End Sub
'''입력문자열이 파일로 변환되는지?
Public Function isFileName(fn As String) As Boolean
Try
Dim fi As New System.IO.FileInfo(fn)
Return True
Catch ex As Exception
Return False
End Try
End Function
Public Function DirCreate(path As String) As Boolean
Try
System.IO.Directory.CreateDirectory(path)
Return True
Catch ex As Exception
PLog.Add(ArinLog.ArinLog.ETYPE.ERROR, "폴더생성실패(" + path + ") " + ex.Message, True)
Return False
End Try
End Function
'Public _ParseFormats As String() = { _
' "(?<dir>[\-dl])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\w+\s+\w+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{4})\s+(?<name>.+)", _
' "(?<dir>[\-dl])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\d+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{4})\s+(?<name>.+)", _
' "(?<dir>[\-dl])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\d+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{1,2}:\d{2})\s+(?<name>.+)", _
' "(?<dir>[\-dl])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\w+\s+\w+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{1,2}:\d{2})\s+(?<name>.+)", _
' "(?<dir>[\-dl])(?<permission>([\-r][\-w][\-xs]){3})(\s+)(?<size>(\d+))(\s+)(?<ctbit>(\w+\s\w+))(\s+)(?<size2>(\d+))\s+(?<timestamp>\w+\s+\d+\s+\d{2}:\d{2})\s+(?<name>.+)", _
' "(?<timestamp>\d{2}\-\d{2}\-\d{2}\s+\d{2}:\d{2}[Aa|Pp][mM])\s+(?<dir>\<\w+\>){0,1}(?<size>\d+){0,1}\s+(?<name>.+)"}
'Public Function GetMatchingRegex(ByVal line As String) As System.Text.RegularExpressions.Match
' Dim rx As System.Text.RegularExpressions.Regex, m As System.Text.RegularExpressions.Match
' For i As Integer = 0 To _ParseFormats.Length - 1
' rx = New System.Text.RegularExpressions.Regex(_ParseFormats(i))
' m = rx.Match(line)
' If m.Success Then Return m
' Next
' Return Nothing
'End Function
'Public Enum SFtpType
' Link = 0
' File = 1
' Dir = 2
'End Enum
'Public Structure SFTPDetail
' Dim FileType As SFtpType
' Dim FileName As String
' Dim Size As Long
' Dim Permission As String
' Dim TimeStamp As String
'End Structure
'Public Function FtpDirParser(dirList() As String) As List(Of SFTPDetail)
' Dim retval As New List(Of SFTPDetail)
' For Each line As String In dirList
' Dim m As System.Text.RegularExpressions.Match = GetMatchingRegex(line)
' If Not m Is Nothing Then
' Dim newdr As New SFTPDetail
' Dim name As String = m.Groups("name").Value
' Dim perm As String = m.Groups("poermission").Value
' Dim _dir As String = m.Groups("dir").Value
' newdr.TimeStamp = m.Groups("timestamp").Value
' Dim filetype As String = ""
' Dim size As Long = 0
' If _dir.ToLower = "l" Then
' filetype = "LINK"
' size = 0
' newdr.FileType = SFtpType.Link
' ElseIf _dir.ToLower = "d" OrElse _dir.ToLower = "<dir>" Then
' filetype = "DIR"
' size = 0
' newdr.FileType = SFtpType.Dir
' Else
' filetype = "FILE"
' size = Long.Parse(m.Groups("size").Value)
' newdr.FileType = SFtpType.File
' End If
' newdr.Permission = perm
' newdr.FileName = name
' newdr.Size = size
' retval.Add(newdr)
' End If
' Next
' Return retval
'End Function
Public FTP_0 As FTPClients.Client_2
Public Enum E_DesDirType
desPath = 1 '//대상폴더
CustomPath = 2 '//조합에의한 폴더
End Enum
Public Enum E_baktype
none = 0
Folder1 = 1
CurrnetFolder = 2
ParentFolder = 3
End Enum
Structure S_Log
Dim Result As Char
Dim OrgFile As String
Dim DesFile As String
Dim Orgpath As String
Dim DesPath As String
Dim Msg As String
End Structure
Enum E_Runtype
Copy = 0
Delete = 1
Move = 2
End Enum
Public Log As ArrayList
Public log2 As ArrayList
Public Fileok As ArrayList '//성공한 파일목록
Public Ep As String
Public BakTag As String = "-원본(" & Format(Now, "MMdd") & ")" '& "_MOV_D"
Public Function GetBakDir1() As String
Return MDiMain.tb_bakdir1.Text
End Function
Public Function SaveExcelFile(fn As String, dt As DataTable)
Dim fp As New FarPoint.Win.Spread.FpSpread()
fp.DataSource = dt
Return fp.SaveExcel(fn, FarPoint.Excel.ExcelSaveFlags.SaveBothCustomRowAndColumnHeaders)
End Function
Public Function GetBackType1() As E_baktype
Select Case MDiMain.cbBakType.SelectedIndex
Case 0
Return E_baktype.none
Case 1
Return E_baktype.Folder1
Case 2
Return E_baktype.CurrnetFolder
Case 3
Return E_baktype.ParentFolder
End Select
'If MDiMain.btBakNo.Pressed Then
' Return E_baktype.none
'ElseIf MDiMain.btBakSrc.Pressed Then
' Return E_baktype.CurrnetFolder
'ElseIf MDiMain.btBakUpDir.Pressed Then
' Return E_baktype.ParentFolder
'Else
' Return E_baktype.Folder1
'End If
End Function
Public Function GetrunType() As E_Runtype
If MDiMain.btDel.Pressed Then
Return 1
ElseIf MDiMain.btMove.Pressed Then
Return 2
Else
Return 0
End If
End Function
Public Function GetWorkDIr() As String
Try
Return CStr(MDiMain.tb_workdir.Text).Replace("\\", "\").Replace("//", "/")
Catch ex As Exception
Return "작업폴더에 문제가있습니다"
End Try
End Function
Public Function GetExtendFromMdi() As String
Try
Return "*." & MDiMain.tb_ext.Text
Catch ex As Exception
Return "*.*"
End Try
End Function
Public Function GetExtendOnly() As String
Return MDiMain.tb_ext.Text
End Function
Public Function GetSubDir() As Boolean
Try
Return MDiMain.chk_subdir.Checked
Catch ex As Exception
Return True
End Try
End Function
Public Function GetSubdirType() As Short
If MDiMain.chk_subdir.Checked Then
Return 1
Else
Return 0
End If
End Function
Public MyINI As New CommonClassv2.MyINI(My.Application.Info.DirectoryPath & "\main.ini")
Public Arin As New CommonClassv2.ARINCLASS
Public Sub Addlog(ByVal 성공여부 As String, ByVal 원본파일 As String, ByVal 대상파일 As String, ByVal 메세지 As String, Optional ByVal reset As Boolean = False)
If reset Then Log = New ArrayList
Log.Add(성공여부 & "/" & 원본파일 & "/" & 대상파일 & "/" & 메세지)
End Sub
Public Sub Addlog2(ByVal msg As String, Optional ByVal reset As Boolean = False)
If reset Then log2 = New ArrayList
log2.Add(">> " & msg)
'Frm_log.RichTextBox1.AppendText(">> " & msg)
'Frm_log.RichTextBox1.AppendText(vbCrLf)
End Sub
Public Sub makelog2(ByVal msg As String)
Try
Form_Status.RichTextBox1.AppendText(msg)
Form_Status.RichTextBox1.AppendText(vbCrLf)
Catch ex As Exception
End Try
End Sub
Public Sub MakeBakLog1()
Form_Status.RichTextBox2.Clear()
For Each Msg As String In Backupfolder1
Form_Status.RichTextBox2.AppendText(Msg)
Form_Status.RichTextBox2.AppendText(vbCrLf)
Next
End Sub
Public Function getSP() As Integer
If String.IsNullOrEmpty(MDiMain.tb_sttrange.Text) Then MDiMain.tb_sttrange.Text = "1"
Return MDiMain.tb_sttrange.Text '//목록에서 시작줄번호
End Function
Public Sub Errlog(ByVal amsg As String)
Dim Fs As New System.IO.FileStream(My.Application.Info.DirectoryPath & "\error.txt", FileMode.Create)
Dim Sw As New System.IO.StreamWriter(Fs, System.Text.Encoding.Default)
Sw.WriteLine("시간:" & Now.ToShortDateString & ":" & Now.ToShortTimeString & vbCrLf & amsg)
Sw.Close()
Sw.Dispose()
Fs.Close()
Fs.Dispose()
End Sub
End Module

View File

@@ -0,0 +1,183 @@
Imports System.IO
Imports System.Threading
Imports System.Data
Module Mod_Delete
'Public Sub DeleteFile()
' DeleteFileFromList()
'End Sub
'Public Sub DeleteFileFromList() '//파일목록으로부터 삭제대상폴더의 파일을 삭제한다.
' Dim FileList As New ArrayList
' Dim FI() As FileInfo
' Dim Di As DirectoryInfo
' If MsgBox("파일삭제작업을 진행하시겠습니까?", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "삭제확인") <> MsgBoxResult.Ok Then
' MsgBox("취소되었습니다", MsgBoxStyle.Information, "확인")
' Return
' End If
' '//파일목록을 작성합니다.
' MSG("삭제 진행중...")
' MDiMain.pbar2.Minimum = 0
' MDiMain.pbar2.Maximum = Ep
' MDiMain.Refresh()
' Addlog2("삭제시작 줄번호 범위 " & SP & " ~ " & Ep, True)
' Dim NullCnt As Short = 0
' Dim fn As String
' For i As Integer = SP To Ep
' MDiMain.pbar2.Value = i
' If i Mod 10 = 0 Then
' MSG("삭제중 (" & i & "/" & Ep & ")")
' MDiMain.Refresh()
' End If
' fn = Frm_srcfile.Get_FileList(i + 1) & Mod_Comm.GetExtendFromMdi.Trim("*")
' If fn.Trim <> "" Then
' NullCnt = 0 '//파일을 삭제하는 루틴을 만든다.
' Di = New DirectoryInfo(GetWorkDIr) '//경로선택
' FI = Di.GetFiles(fn, GetSubdirType)
' If FI.Length < 1 Then
' addlog("X", fn, "", "파일없음")
' End If
' For Each F As FileInfo In FI '//일치하는 모든 파일을 삭제한다.
' If F.FullName.IndexOf("-원본") = -1 Then '//백업이 만들어놓은 폴더의 파일은 제낀다.
' Fileok.Add(F.FullName) '//정상파일목록을 가진다.
' addlog("O", F.FullName, "", "삭제")
' If Mod_Comm.GetExeType Then ''//모의실행은 백업및 작업을 하지않는다.
' '//백업정책을 확인해서 해당 파일을 백업할곳을 결정한다.
' Check_Backup(F, BakTag)
' F.Delete()
' End If
' End If
' Next
' Else
' NullCnt += 1
' If NullCnt = 5 Then '//빈줄이나올때 널카운트를 증가시키고 빈줄이 5번연속나올때는 빠져나온다.
' Exit For
' End If
' End If
' Next
' Addlog2("삭제작업이 완료되었습니다")
' 'Frm_Wait.Hide()
'End Sub
Public Sub DeleteFileM(Param As RunParam) '//파일목록으로부터 삭제대상폴더의 파일을 삭제한다.
'//파일목록을 작성합니다.
MDiMain.MSG("삭제목록 작성중...")
'//변수목록
Dim NR As ireaDataSet.WorkListRow
Dim WRow() As ireaDataSet.FileListRow
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.SrcList Is Nothing Then
MsgBox("파일목록이 존재하지않습니다." & vbCrLf & "진행할 수 없습니다", MsgBoxStyle.Information, "확인")
Return
End If
index += 1
Application.DoEvents()
MDiMain.ShowCnt1(index, endcnt, "목록작성")
'//전체목록에서 원본목록 검색
WRow = MDiMain.DataSet1.FileList.Select("파일명 like '" & drs.목록명 & "'")
If WRow.Length = 0 Then Addlog("X", drs.목록명, "", "파일없음")
For Each dr As ireaDataSet.FileListRow In WRow '//일치하는 목록들 작업목록에 집어넣는다.
NR = MDiMain.DataSet1.WorkList.NewWorkListRow
NR.원본경로 = dr.경로
NR.원본파일명 = dr.파일명
NR.구분 = "삭제"
NR.대상경로 = dr.경로
NR.대상파일명 = dr.파일명
NR.오류 = ""
If NR.대상파일명.IndexOf("*") = -1 AndAlso NR.대상파일명.IndexOf("?") = -1 Then
Try
MDiMain.DataSet1.WorkList.Rows.Add(NR)
Catch ex As Exception '//추가오류는 뻔하다이미 그 파일이 있는경우다.
NR.오류 = "중복된 삭제대상파일입니다(" & Format(Now, "HHmmss") & ")"
MDiMain.DataSet1.WorkList.Rows.Add(NR)
makelog2("중복된 삭제대상파일이 생성되었습니다")
makelog2(" 파일명 : " & NR.원본경로 & "\" & NR.원본파일명)
'If MsgBox("중복된 대상파일이 확인되었습니다" & vbCrLf & vbCrLf & "계속하시겠습니까?", MsgBoxStyle.Information Or MsgBoxStyle.OkCancel, "확인") <> MsgBoxResult.Ok Then
' Return
'End If
End Try
End If
Next
Next
MDiMain.MSG("삭제목록 작성완료...")
'If GetExeType() Then '//실제실행일경우
' DeleteFileR()
'Else '//모의실행일경우
' Addlog2("모의실행 : 실제 복사/이동/삭제는 수행되지 않습니다")
' MsgBox("모의실행입니다" & vbCrLf & "실제파일의 복사/이동/삭제 는 수행되지 않습니다", MsgBoxStyle.Information, "확인")
'End If
End Sub
Public Sub DeleteFileR(winhide As Boolean) '//실제로 파일을 삭제합니다. 삭제시 성공여부를 기록합니다
Dim FI As FileInfo
Dim Err As Boolean = False
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, "파일삭제")
Application.DoEvents()
If Dr.오류 <> "" Then
Errlog("선오류감지되어서 넘어갑니다(" & Dr.오류 & ")")
Else
Try
FI = New FileInfo(CStr(Dr.원본경로 & "\" & Dr.원본파일명).Replace("\\", "\"))
Check_Backup(FI, BakTag)
If FI.Exists = False Then Dr.오류 = "파일없음"
Try
FI.Delete()
Dr.성공 = "O"
Dr.오류 = ""
Catch ex As Exception
Err = True
Dr.성공 = "X"
Dr.오류 = ex.Message.ToString()
End Try
Catch ex As Exception
Err = True
Dr.성공 = "X"
Dr.오류 = ex.Message
Errlog("FI = New FileInfo(CStr(Dr.원본경로 &)" & ex.Message.ToString)
End Try
End If
Next
MDiMain.MSG("파일 [삭제] 완료" & IIf(Err, "(일부파일에 오류가 발생하였습니다", ""))
End Sub
End Module