多线程文件备份(VB.NET版)

原文链接:Multithreading Backup Utility

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

多线程文件备份(VB.NET版)


简介

多线程迟早是我们要面对的一个东西,本文向你展示了一个简单的使用两个线程来拷贝文件的应用程序

Backup将一个目录中文件拷贝到另一个目录中,它使用了一个线程来显示正被拷贝的文件名称,另一个线程用来在拷贝的文件的同时统计文件数目和文件夹数目。这就意味着在拷贝可以开始之前不用浪费时间去等待文件数目的统计完成,我们使用了两个线程同时完成拷贝和统计工作。

Backup对于大数量文件的拷贝也是快速和有效率的。它很快是因为当目标文件已经存在并且没有改变过时就不做拷贝工作,因此它对于重复拷贝来说不错,因为它只拷贝新文件或更新过的文件。

这个程序的另一个特点是当在一个特点文件上发生安全性错误或其他类型错误(当然不包括硬件错误),它不会停止拷贝工作,它将会记录下错误信息并继续完成工作。过后你可以去查看日志文件,它会告诉你发生了什么错误。大部分错误都是由于安全配置问题产生的。

背景知识

为什么要使用多线程呢?一个原因可能一个窗口在忙碌时,你想能点击窗口上的一个按钮。另一个原因是多核时代已经来临,硬件和操作系统级别的多任务也存在,线程无可避免,尤其当我们关注性能时。

好的,你已经决定你想在.Net中使用多线程。你可以使用BackgroundWorker, 不过我假定你应该从System.Threading开始,并直接使用Thread类。个人看来,它更容易使用,并且更具灵活性。

那么线程到底是什么呢?它就好比于一个源自于你的主程序的另一个完全分离的程序。一旦线程启动,主程序对线程完全不知道。它们生死自控。要启动一个或两个线程,你可能想知道如何创建线程,如何传递数据,如何从子线程中回调主应用程序以及主应用程序如何知道是哪个子线程回调了它?下面的代码片段会回答这些问题的。

最后一点,作者将一个类实例的方法赋予了一个线程,尽管可以将主程序的方法赋予线程,但作者认为这样做更好。

多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Declarefirstthreadvariable.Thiswillbeusedtocopythefiles.
多线程文件备份(VB.NET版)
PrivateCopyThreadAsThread'拷贝线程
多线程文件备份(VB.NET版)

多线程文件备份(VB.NET版)
'Delclaresecondthreadvariable.Thiswillbeusedtocountthefoldersandfiles.
多线程文件备份(VB.NET版)
PrivateCountThreadAsThread'统计线程
多线程文件备份(VB.NET版)

统计线程一般在拷贝线程前面完成,除非你拷贝的文件数目很小,那种情况下一切都发生的很快。

另一方面,统计线程结束后,总文件数目会被统计出来,从而用来设置ProgressBar1.Max属性,

下面是启动拷贝线程和统计线程的代码:

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)PrivateSubStartCopy_Click()SubStartCopy_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesStartCopy.Click
多线程文件备份(VB.NET版)
'开始拷贝
多线程文件备份(VB.NET版)
'Validatefromandtofolders
多线程文件备份(VB.NET版)
IfNotSetRootPathThenExitSub
多线程文件备份(VB.NET版)
IfNotCheckFromPath()ThenExitSub
多线程文件备份(VB.NET版)
IfNotCheckToPath()ThenExitSub
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createaninstanceofthecopyclassthatwillbeassignedtothefirstthread.
多线程文件备份(VB.NET版)
DimFileCopyAsNewCopyClass(Me)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Setrequiredproperties
多线程文件备份(VB.NET版)
FileCopy.FromPath=FromPathTextbox.Text
多线程文件备份(VB.NET版)
FileCopy.ToPath=ToPathTextbox.Text&_rootDir
多线程文件备份(VB.NET版)
FileCopy.StartDateTime=DateTime.Now
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Savelogfilename
多线程文件备份(VB.NET版)
_logFile=FileCopy.LogFileName
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createthethreadandassigntheclassinstanceandmethodtoexecute
多线程文件备份(VB.NET版)
'(CopyFilesinthiscase)whenthethreadisstarted.
多线程文件备份(VB.NET版)
CopyThread=NewThread(AddressOfFileCopy.CopyFiles)'拷贝线程
多线程文件备份(VB.NET版)

多线程文件备份(VB.NET版)
'Startthefirstthreadtocopythefiles.
多线程文件备份(VB.NET版)
CopyThread.Name="Copy"
多线程文件备份(VB.NET版)CopyThread.IsBackground
=True
多线程文件备份(VB.NET版)CopyThread.Start()
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createanotherinstanceofthecopyclassthatwillbeassignedtothesecondthread.
多线程文件备份(VB.NET版)
DimFileFolderCountAsNewCopyClass(Me)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Setrequiredproperties
多线程文件备份(VB.NET版)
FileFolderCount.FromPath=FromPathTextbox.Text
多线程文件备份(VB.NET版)FileFolderCount.ToPath
=ToPathTextbox.Text
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createthethreadandassigntheclassinstanceandmethodtoexecute
多线程文件备份(VB.NET版)
'(CopyFilesinthiscase)whenthethreadisstarted.
多线程文件备份(VB.NET版)
CountThread=NewThread(AddressOfFileFolderCount.GetCountData)'计数线程
多线程文件备份(VB.NET版)

多线程文件备份(VB.NET版)
'Startthesecondthreadtocountfoldersandfileswhilethecopyisrunningatthesametime.
多线程文件备份(VB.NET版)
CountThread.Name="Count"
多线程文件备份(VB.NET版)CountThread.IsBackground
=True
多线程文件备份(VB.NET版)CountThread.Start()
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Resetformcontrols
多线程文件备份(VB.NET版)
StartCopy.Enabled=False
多线程文件备份(VB.NET版)Panel1.Enabled
=False
多线程文件备份(VB.NET版)StopCopy.Enabled
=True
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)

下面是终止两个线程的代码:

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)PrivateSubStopCopy_Click()SubStopCopy_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesStopCopy.Click
多线程文件备份(VB.NET版)
'终止线程
多线程文件备份(VB.NET版)
IfCopyThread.IsAliveThenCopyThread.Abort()
多线程文件备份(VB.NET版)
IfCountThread.IsAliveThenCountThread.Abort()
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)

主界面的两个delegate方法,用来响应子线程的回调,刷新主界面

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)PublicSubCopyThreadMessage()SubCopyThreadMessage(ByValThreadNameAsString,ByValCopiedFilesAsLong,ByValMessageAsString)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Iffinishedcopying
多线程文件备份(VB.NET版)
IfMessage="END"Then
多线程文件备份(VB.NET版)lblStatus.Text
="Status:CopyFinsihed.Copied"+_totalFiles.ToString+"filesin"+_totalFolders.ToString+"folders."
多线程文件备份(VB.NET版)txtFile.Text
="Copycompletedsuccessfully."
多线程文件备份(VB.NET版)ProgressBar1.Value
=ProgressBar1.Maximum
多线程文件备份(VB.NET版)CopyThread.Abort()
多线程文件备份(VB.NET版)CountThread.Abort()
多线程文件备份(VB.NET版)
ExitSub
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Showcurrentfile
多线程文件备份(VB.NET版)
txtFile.Text="Copying:"&Message
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Updateprogressbar
多线程文件备份(VB.NET版)
IfProgressBar1.Maximum<>0ThenProgressBar1.Value=_totalFiles-(_totalFiles-CopiedFiles)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Updatestatus(TotalFilesnotzeromeanscountinghasfinished)
多线程文件备份(VB.NET版)
If_totalFiles<>0Then
多线程文件备份(VB.NET版)lblStatus.Text
="Status:Copying.Thereare"+_totalFiles.ToString+"filesin"+_totalFolders.ToString+"folders.Filescopiedsofar"&CopiedFiles&"."
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'SaveforCountThreadMessage()
多线程文件备份(VB.NET版)
_copiedFiles=CopiedFiles
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicSubCountThreadMessage()SubCountThreadMessage(ByValThreadNameAsString,ByValFilesAsLong,ByValTotalFilesAsLong,ByValFoldersAsLong,ByValMessageAsString)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Displaycurrentcount
多线程文件备份(VB.NET版)
lblStatus.Text="Status:CopyingandCounting.Sofarthereare"+Files.ToString+"filesin"+Folders.ToString+"folders."
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'SavetotalswhenfinishedcountingforCopyThreadMessage()
多线程文件备份(VB.NET版)
IfMessage="END"Then
多线程文件备份(VB.NET版)_totalFiles
=TotalFiles
多线程文件备份(VB.NET版)_totalFolders
=Folders
多线程文件备份(VB.NET版)lblStatus.Text
="Status:Copying.Thereare"+_totalFiles.ToString+"filesin"+_totalFolders.ToString+"folders.Filescopiedsofar"&_copiedFiles&"."
多线程文件备份(VB.NET版)ProgressBar1.Maximum
=_totalFiles
多线程文件备份(VB.NET版)ProgressBar1.Value
=_totalFiles-(_totalFiles-_copiedFiles)
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)

负责拷贝和统计的类:

多线程文件备份(VB.NET版)ImportsSystem.Threading
多线程文件备份(VB.NET版)
ImportsSystem.IO
多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicClassCopyClassClassCopyClass
多线程文件备份(VB.NET版)
'Thiswillholdthereferencetotheclientform
多线程文件备份(VB.NET版)
Private_clientAppAsForm
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CreateadelegatemethodthatwillmaptotheCopyThreadMessagemethodoftheclientapp
多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateDelegateSubCallClientCopy()SubCallClientCopy(ByValThreadNameAsString,ByValFilesRemainingAsLong,ByValMessageAsString)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CreateadelegatemethodthatwillmaptotheCountThreadMessagemethodoftheclientapp
多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateDelegateSubCallClientCount()SubCallClientCount(ByValThreadNameAsString,ByValTotalFilesAsLong,ByValTotalFoldersAsLong,ByValFilesAsLong,ByValMessageAsString)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createanobjectforeachdeletegate
多线程文件备份(VB.NET版)
Private_callClientCopyAsCallClientCopy
多线程文件备份(VB.NET版)
Private_callClientCountAsCallClientCount
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Propertyvariables
多线程文件备份(VB.NET版)
Private_firstTimeAsBoolean
多线程文件备份(VB.NET版)
Private_fromPathAsString
多线程文件备份(VB.NET版)
Private_toPathAsString
多线程文件备份(VB.NET版)
Private_directoriesAsLong
多线程文件备份(VB.NET版)
Private_filesAsLong
多线程文件备份(VB.NET版)
Private_copiedFilesAsLong
多线程文件备份(VB.NET版)
Private_totalFilesAsLong
多线程文件备份(VB.NET版)
Private_fileNameAsString
多线程文件备份(VB.NET版)
Private_logFileAsStreamWriter
多线程文件备份(VB.NET版)
Private_startDateTimeAsDate
多线程文件备份(VB.NET版)
Private_logFileNameAsString
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Constants
多线程文件备份(VB.NET版)
PrivateConstLOG_FILEAsString="BackupLog.txt"
多线程文件备份(VB.NET版)
PrivateConstERR_MSGAsString="Erroraccessingfile:"
多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicSubNew()SubNew(ByRefClientAppAsBackup)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Savethereferencetotheclientapp
多线程文件备份(VB.NET版)
_clientApp=ClientApp
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Assigndelegateobjects
多线程文件备份(VB.NET版)
_callClientCopy=AddressOfClientApp.CopyThreadMessage
多线程文件备份(VB.NET版)_callClientCount
=AddressOfClientApp.CountThreadMessage
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicSubCopyFiles()SubCopyFiles()
多线程文件备份(VB.NET版)
'Dotheworkofthefirstthreadhere
多线程文件备份(VB.NET版)

多线程文件备份(VB.NET版)
'Givethisthreadaname
多线程文件备份(VB.NET版)
IfThread.CurrentThread.Name=NothingThenThread.CurrentThread.Name="Copy"
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CreateanewDirectoryInfoobjectforfrompath.
多线程文件备份(VB.NET版)
DimdirAsNewDirectoryInfo(FromPath)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CalltheGetFileSystemInfosmethod.
多线程文件备份(VB.NET版)
DimFSinfoAsFileSystemInfo()=dir.GetFileSystemInfos
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Openlogfile
多线程文件备份(VB.NET版)
OpenLog()
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Copyonefileatatimeloopinguntilallfilesarecopied
多线程文件备份(VB.NET版)
ReallyCopyFiles(FSinfo)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)WriteLog(
"Copycompletedsuccessfully.")
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Callclientonelasttimetosignalendofcopy
多线程文件备份(VB.NET版)
CallClient(Thread.CurrentThread.Name,_copiedFiles,_totalFiles,_directories,"END")
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicSubGetCountData()SubGetCountData()
多线程文件备份(VB.NET版)
'Dotheworkofthesecondthreadhere
多线程文件备份(VB.NET版)

多线程文件备份(VB.NET版)
'Givethisthreadaname
多线程文件备份(VB.NET版)
IfThread.CurrentThread.Name=NothingThenThread.CurrentThread.Name="Count"
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CreateanewDirectoryInfoobjectforfrompath.
多线程文件备份(VB.NET版)
DimdirAsNewDirectoryInfo(FromPath)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CalltheGetFileSystemInfosmethod.
多线程文件备份(VB.NET版)
DimFSinfoAsFileSystemInfo()=dir.GetFileSystemInfos
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Countfolderandfiles
多线程文件备份(VB.NET版)
CountFiles(FSinfo)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Savetotalfilescount
多线程文件备份(VB.NET版)
_totalFiles=_files
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Sendmessagetoclientform
多线程文件备份(VB.NET版)
CallClient(Thread.CurrentThread.Name,_files,_totalFiles,_directories,"END")
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateSubReallyCopyFiles()SubReallyCopyFiles(ByValFSInfoAsFileSystemInfo())
多线程文件备份(VB.NET版)
'ChecktheFSInfoparameter.
多线程文件备份(VB.NET版)
IfFSInfoIsNothingThen
多线程文件备份(VB.NET版)
ThrowNewArgumentNullException("FSInfo")
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Iteratethrougheachitem.
多线程文件备份(VB.NET版)
DimiAsFileSystemInfo
多线程文件备份(VB.NET版)
ForEachiInFSInfo
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
Try
多线程文件备份(VB.NET版)
'ChecktoseeifthisisaDirectoryInfoobject.
多线程文件备份(VB.NET版)
IfTypeOfiIsDirectoryInfoThen
多线程文件备份(VB.NET版)
'CasttheobjecttoaDirectoryInfoobject.
多线程文件备份(VB.NET版)
DimdInfoAsDirectoryInfo=CType(i,DirectoryInfo)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Iterate(recurse)throughallsub-directories.
多线程文件备份(VB.NET版)
ReallyCopyFiles(dInfo.GetFileSystemInfos())
多线程文件备份(VB.NET版)
'ChecktoseeifthisisaFileInfoobject.
多线程文件备份(VB.NET版)
ElseIfTypeOfiIsFileInfoThen
多线程文件备份(VB.NET版)
'savethefullpathandfilename
多线程文件备份(VB.NET版)
_fileName=i.FullName
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Getthecopypathnameonly
多线程文件备份(VB.NET版)
DimcopypathAsString=ToPath&Mid(_fileName,Len(FromPath)+1,Len(_fileName)-Len(FromPath)-Len(i.Name))
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createcopypathifitdoesnotexist
多线程文件备份(VB.NET版)
IfNotDirectory.Exists(copypath)Then
多线程文件备份(VB.NET版)Directory.CreateDirectory(copypath)
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Getthetopathandfilename
多线程文件备份(VB.NET版)
DimtofileAsString=ToPath&Mid(_fileName,Len(FromPath)+1)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Updatestatusinfoonclient
多线程文件备份(VB.NET版)
DimfiAsNewFileInfo(_fileName)
多线程文件备份(VB.NET版)
DimMessageAsString=_fileName&"is"&Decimal.Round(CDec(fi.Length/1048576),2)&"MBinlength."
多线程文件备份(VB.NET版)CallClient(Thread.CurrentThread.Name,_copiedFiles,_totalFiles,_directories,Message)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'iffileexistscheckiffilehasbeenupdatedsincelastcopy
多线程文件备份(VB.NET版)
DimOkayToCopyAsBoolean=True
多线程文件备份(VB.NET版)
IfFile.Exists(tofile)Then
多线程文件备份(VB.NET版)
IfFile.GetLastWriteTime(_fileName)=File.GetLastWriteTime(tofile)Then
多线程文件备份(VB.NET版)OkayToCopy
=False
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Copyfilewithoverwrite
多线程文件备份(VB.NET版)
IfOkayToCopyThenFile.Copy(_fileName,tofile,True)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Incrementcopiedfilecount
多线程文件备份(VB.NET版)
_copiedFiles+=1
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
CatchexAsException
多线程文件备份(VB.NET版)
'Reporterrorbutcontinueprocessing
多线程文件备份(VB.NET版)
WriteLog(ERR_MSG&_fileName&vbCrLf&ex.Message.ToString)
多线程文件备份(VB.NET版)
EndTry
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
Nexti
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateSubCountFiles()SubCountFiles(ByValFSInfoAsFileSystemInfo())
多线程文件备份(VB.NET版)
StaticShowCountAsLong=0
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'ChecktheFSInfoparameter.
多线程文件备份(VB.NET版)
IfFSInfoIsNothingThen
多线程文件备份(VB.NET版)
ThrowNewArgumentNullException("FSInfo")
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Iteratethrougheachitem.
多线程文件备份(VB.NET版)
DimiAsFileSystemInfo
多线程文件备份(VB.NET版)
ForEachiInFSInfo
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
Try
多线程文件备份(VB.NET版)
'ChecktoseeifthisisaDirectoryInfoobject.
多线程文件备份(VB.NET版)
IfTypeOfiIsDirectoryInfoThen
多线程文件备份(VB.NET版)
'Addonetothedirectorycount.
多线程文件备份(VB.NET版)
_directories+=1
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CasttheobjecttoaDirectoryInfoobject.
多线程文件备份(VB.NET版)
DimdInfoAsDirectoryInfo=CType(i,DirectoryInfo)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Iterate(recurse)throughallsub-directories.
多线程文件备份(VB.NET版)
CountFiles(dInfo.GetFileSystemInfos())
多线程文件备份(VB.NET版)
'ChecktoseeifthisisaFileInfoobject.
多线程文件备份(VB.NET版)
ElseIfTypeOfiIsFileInfoThen
多线程文件备份(VB.NET版)
'Addonetothefilecount.
多线程文件备份(VB.NET版)
_files+=1
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'displaycountforfirstfileineveryfolderthenevery200-forfasterperformance
多线程文件备份(VB.NET版)
SelectCaseShowCount
多线程文件备份(VB.NET版)
Case0
多线程文件备份(VB.NET版)
'Displaycount
多线程文件备份(VB.NET版)
CallClient(Thread.CurrentThread.Name,_files,_totalFiles,_directories,"")
多线程文件备份(VB.NET版)
CaseIs>=200
多线程文件备份(VB.NET版)
'Displaycount
多线程文件备份(VB.NET版)
CallClient(Thread.CurrentThread.Name,_files,_totalFiles,_directories,"")
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'resetsodisplayisevery200filesinfolder
多线程文件备份(VB.NET版)
ShowCount=0
多线程文件备份(VB.NET版)
EndSelect
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Incrementshowcount
多线程文件备份(VB.NET版)
ShowCount+=1
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
CatchexAsException
多线程文件备份(VB.NET版)
'Recorderrorthencontinue(likearesumenext)
多线程文件备份(VB.NET版)
WriteLog(ERR_MSG&_fileName&vbCrLf&ex.Message.ToString)
多线程文件备份(VB.NET版)
EndTry
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
Nexti
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateSubCallClient()SubCallClient(ByValThreadNameAsString,ByValFilesAsLong,ByValTotalFilesAsLong,ByValDirectoriesAsLong,ByValMessageAsString)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
SelectCaseThreadName
多线程文件备份(VB.NET版)
Case"Copy"
多线程文件备份(VB.NET版)
'Callthedelegatedmethod
多线程文件备份(VB.NET版)
_clientApp.Invoke(_callClientCopy,ThreadName,Files,Message)
多线程文件备份(VB.NET版)
Case"Count"
多线程文件备份(VB.NET版)
'Callthedelegatedmethod
多线程文件备份(VB.NET版)
_clientApp.Invoke(_callClientCount,ThreadName,Files,TotalFiles,Directories,Message)
多线程文件备份(VB.NET版)
EndSelect
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Letthethreadsleepbeforecontinuingsotheclientappwillhavetimetobeprocess(1millisecondisenough)
多线程文件备份(VB.NET版)
Thread.Sleep(0)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateSubOpenLog()SubOpenLog()
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'Createlogfile
多线程文件备份(VB.NET版)
IfNotFile.Exists(StartDateTime&"-"&LOG_FILE)Then
多线程文件备份(VB.NET版)
Using_logFileAsStreamWriter=File.CreateText(LogFileName)
多线程文件备份(VB.NET版)_logFile.WriteLine(
"Logfilenameis:"&LogFileName)
多线程文件备份(VB.NET版)_logFile.WriteLine(
"BACKUPLOGFILESTARTEDAT:"&StartDateTime.ToString)
多线程文件备份(VB.NET版)_logFile.WriteLine(
"================================================")
多线程文件备份(VB.NET版)_logFile.Write(
"CopyingFROM:"&_fromPath)
多线程文件备份(VB.NET版)_logFile.WriteLine()
多线程文件备份(VB.NET版)_logFile.Write(
"CopyingTO:"&_toPath)
多线程文件备份(VB.NET版)_logFile.WriteLine()
多线程文件备份(VB.NET版)_logFile.Close()
多线程文件备份(VB.NET版)
EndUsing
多线程文件备份(VB.NET版)
EndIf
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateSubWriteLog()SubWriteLog(ByValMessageAsString)
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
'CreateaninstanceofStreamWritertowritetexttoafile.
多线程文件备份(VB.NET版)
Using_logFileAsStreamWriter=File.AppendText(LogFileName)
多线程文件备份(VB.NET版)
'Addsometexttothefile.
多线程文件备份(VB.NET版)
_logFile.WriteLine()
多线程文件备份(VB.NET版)_logFile.WriteLine(
"TIMEOFLOGENTRY:"&DateTime.Now)
多线程文件备份(VB.NET版)
'Arbitraryobjectscanalsobewrittentothefile.
多线程文件备份(VB.NET版)
_logFile.WriteLine(Message)
多线程文件备份(VB.NET版)_logFile.Flush()
多线程文件备份(VB.NET版)_logFile.Close()
多线程文件备份(VB.NET版)
EndUsing
多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivateSubCloseLog()SubCloseLog()
多线程文件备份(VB.NET版)
IfFile.Exists(LogFileName)Then_logFile.Close()
多线程文件备份(VB.NET版)
EndSub

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PrivatePropertyFirstTime()PropertyFirstTime()AsBoolean
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_firstTime
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
Set(ByValvalueAsBoolean)
多线程文件备份(VB.NET版)_firstTime
=value
多线程文件备份(VB.NET版)
EndSet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicPropertyFromPath()PropertyFromPath()AsString
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_fromPath
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
Set(ByValvalueAsString)
多线程文件备份(VB.NET版)_fromPath
=value
多线程文件备份(VB.NET版)
EndSet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicPropertyToPath()PropertyToPath()AsString
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_toPath
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
Set(ByValvalueAsString)
多线程文件备份(VB.NET版)_toPath
=value
多线程文件备份(VB.NET版)
EndSet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicPropertyStartDateTime()PropertyStartDateTime()AsDate
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_startDateTime
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
Set(ByValvalueAsDate)
多线程文件备份(VB.NET版)_startDateTime
=value
多线程文件备份(VB.NET版)
EndSet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicReadOnlyPropertyLogFileName()PropertyLogFileName()AsString
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
ReturnFormat(StartDateTime,"yyMMdd-hhmmss")&"-"&LOG_FILE
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicReadOnlyPropertyDirectories()PropertyDirectories()AsLong
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_directories
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicReadOnlyPropertyFiles()PropertyFiles()AsLong
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_files
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)多线程文件备份(VB.NET版)
PublicReadOnlyPropertyTotalFiles()PropertyTotalFiles()AsLong
多线程文件备份(VB.NET版)
Get
多线程文件备份(VB.NET版)
Return_totalFiles
多线程文件备份(VB.NET版)
EndGet
多线程文件备份(VB.NET版)
EndProperty

多线程文件备份(VB.NET版)
多线程文件备份(VB.NET版)
EndClass

多线程文件备份(VB.NET版)

作者的程序中还实现了一个比较有意思的特点,用户可以通过指定命令行参数进入后台命令行模式,而非界面模式,

Last Words

感谢作者的这篇文章,让我能参照他的思路用VC++实现了一个类似的多线程的文件备份工具。

Reference:

原文链接:Multithreading Backup Utility