Utilitaire de copie de fichiers, application console, visual basic

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 992 fois - Téléchargée 21 fois

Contenu du snippet

Cet utilitaire réalise une chose simple :
- il "copie-colle" une liste de fichiers depuis un dossier source (réseau-local) vers un dossier destination
- il évite l'opération laborieuse de sélection, un à un, des fichiers à copier,grâce à une liste des fichiers à copier contenue dans un fichier .txt
- à la fin de la procédure, deux fichiers textes ont été générés : l'un 'SavedFiles.txt' contient tous les fichiers effectivement copiés, l'autre 'NotFoundFiles' inclût les noms de fichiers qui n'ont pas été trouvés au sein du dossier source.

Source / Exemple :


' Author   : Jean-Michel BRASSEUR
' date     : 23 May 2007
' copyright: lestwins59
' language : English

' Import the required Libraries
Imports system '
Imports system.IO '
Imports System.Math '

' Main module
Module ConsCopyFile

    Sub Main()

        Console.Title = "Files Copy Management Utility, Console Application, Visual Basic"
        ' required elements
        ' sourcefile name : parameter
        Dim strPriSourceFileName As String = "FileSource.txt"
        ' to save all of the files names of a directory, without their fullpath:
        ' C:\Documents and Settings\infdev13>dir \\Srvssedriis\GESTDOC\SUD_EST\Commercial\Photothèque\CBM_Batiment /B > "C:\Documents and Settings\infdev13\My Documents\ESPACE_TRAVAIL\listeImgCBMBatiment.txt"
        Dim strPriSourceFileFolderPath As String '= "C:\Documents and Settings\infdev13\My Documents\ESPACE_TRAVAIL\"
        ' sourcefolder's path : parameter
        Dim strPriSourceFolderPath As String '= "\\Srvssedriis\GESTDOC\SUD_EST\Commercial\Photothèque\CBM_Batiment\"
        ' destination's path : parameter
        Dim strPriDestinationFolderPath As String '= "C:\Documents and Settings\infdev13\My Documents\ESPACE_TRAVAIL\Test\"
        ' number of rows of the sourcefile
        Dim intPriNbrRowsTextFile As Integer = 0
        ' maximum length of caracters within the text file
        Dim intPriMaxLengthFileNameTextFile As Integer = 0

        ' the file parameters are being keyed in prominently
        Console.WriteLine("To enable Quick Edit Mode ")
        Console.WriteLine("1. Open a command prompt/command console")
        Console.WriteLine("2. Right-click on the title bar")
        Console.WriteLine("3. Select(properties)")
        Console.WriteLine("4. Select QuickEdit Mode")
        Console.WriteLine("5. Select Save Properties for future windows with same title if you want to keep this change forever. " & Chr(13) _
        & "   Select Apply Properties for current window only if you only want to enable QuickEdit for this session.")
        Console.WriteLine("6. Click(OK)")

        Do

            Console.WriteLine("_____")
            Console.WriteLine("Parameters:")
            Console.Write("Path towards the Filenames Source Text File Folder :")
            strPriSourceFileFolderPath = Console.ReadLine()
            Console.Write("Filenames Source Text File (*.txt):")
            strPriSourceFileName = Console.ReadLine()
            Console.Write("Path towards the Source Folder :")
            strPriSourceFolderPath = Console.ReadLine()
            Console.Write("Path towards the Destination Folder :")
            strPriDestinationFolderPath = Console.ReadLine()
            Console.WriteLine("_____")

            ' get the number of rows of the sourcefile
            intPriNbrRowsTextFile = FunPriGetNbrRowsTextFile(strPriSourceFileFolderPath, strPriSourceFileName)

            ' enables to check if the filenames source text file has been found
        Loop Until intPriNbrRowsTextFile > 0

        ' loop : from the starting row number row within the text file up to reach the finishing row number or the end of file
        Dim intPriRowNberToStartAt As Integer '= 1
        Dim intPriRowNberToFinishAt As Integer '= 20
        Dim boolTestAnswerCopyAllWishedFiles As Boolean = False
        Do
            Dim ckiCopyAllWishedFiles As ConsoleKeyInfo
            Dim strCopyAllWishedFiles As String
            Console.WriteLine("Do you want to copy a certain numbers of files (N) or copy all of them (A)?")
            ckiCopyAllWishedFiles = Console.ReadKey(True)
            strCopyAllWishedFiles = StrConv(ckiCopyAllWishedFiles.KeyChar(), VbStrConv.Uppercase)
            Select Case strCopyAllWishedFiles
                Case Is = "N"
                    Console.Write("Start Line Number :")
                    intPriRowNberToStartAt = Console.ReadLine()
                    Console.Write("End Line Number :")
                    intPriRowNberToFinishAt = Console.ReadLine()
                    boolTestAnswerCopyAllWishedFiles = True
                Case Is = "A"
                    intPriRowNberToStartAt = 1
                    intPriRowNberToFinishAt = FunPriGetNbrRowsTextFile(strPriSourceFileFolderPath, strPriSourceFileName)
                    boolTestAnswerCopyAllWishedFiles = True
                Case Else
                    Console.WriteLine("You did have key in a wrong value")
            End Select
        Loop While boolTestAnswerCopyAllWishedFiles = False

        'the subprocedure bound to the copy core function of the program is being processed
        Console.WriteLine("_____")
        Console.WriteLine("Processing :")
        Call SubPriCopyCurrentFileWithinTextFile(strPriSourceFileFolderPath, _
        strPriSourceFileName, _
        strPriSourceFolderPath, _
        strPriDestinationFolderPath, _
        intPriRowNberToStartAt, _
        intPriRowNberToFinishAt)
        Console.WriteLine("_____")
        Console.WriteLine("Press any key to quit")
        Console.ReadLine()

    End Sub

    Private Function FunPriGetNbrRowsTextFile(ByVal strPriSourceFileFolderPath As String, _
    ByVal strPriSourceFileName As String) As Integer

        Try
            Dim sr As StreamReader
            Dim intPriCounterOfRowsWithinTextFile As Integer = 0
            Dim strPriFileName As String = ""
            Console.WriteLine("")
            Console.WriteLine("Unfolding of the Task:")
            sr = File.OpenText(strPriSourceFileFolderPath & "\" & strPriSourceFileName)
            Do While sr.Peek() >= 0
                strPriFileName = sr.ReadLine()
                intPriCounterOfRowsWithinTextFile += 1
            Loop
            sr.Close()
            Console.WriteLine("The source File contains : " & intPriCounterOfRowsWithinTextFile & " Filenames.")
            Return (intPriCounterOfRowsWithinTextFile)
        Catch
            Console.WriteLine("The Source File containing the Filenames to be copied from has not been found..")
            Return (0)
        End Try

    End Function

    Private Function funPriMaxLengthFileNameTextFile(ByVal strPriSourceFileFolderPath As String, _
    ByVal strPriSourceFileName As String) As Integer

        Try
            Dim sr As StreamReader
            Dim intPriMaxLengthFileNameTextFile As Integer = 0
            Dim strPriFileName As String = ""
            sr = File.OpenText(strPriSourceFileFolderPath & "\" & strPriSourceFileName)
            Do While sr.Peek() >= 0
                strPriFileName = sr.ReadLine()
                If Len(strPriFileName) > intPriMaxLengthFileNameTextFile Then intPriMaxLengthFileNameTextFile = Len(strPriFileName)
            Loop
            sr.Close()
            Return (intPriMaxLengthFileNameTextFile)
        Catch
            Return (0)
        End Try

    End Function

    Private Function strPriAddSpacesOnDisplay(ByVal strPriFileName As String, ByVal strPriSourceFileFolderPath As String, ByVal strPriSourceFileName As String) As String

        Dim intMaxLengthFileNameTextFile As Integer = 0
        Dim strAddOneSpaceToStringValue = ""
        Dim intAddOneSpaceToStringValue As Integer = 0
        intMaxLengthFileNameTextFile = funPriMaxLengthFileNameTextFile(strPriSourceFileFolderPath, strPriSourceFileName)
        strPriAddSpacesOnDisplay = ""

        Do
            strPriAddSpacesOnDisplay += " "
            intAddOneSpaceToStringValue += 1
        Loop Until intAddOneSpaceToStringValue > (intMaxLengthFileNameTextFile - Len(strPriFileName))
        Return (strPriAddSpacesOnDisplay)

    End Function

    Private Sub SubPriCopyCurrentFileWithinTextFile(ByVal strPriSourceFileFolderPath As String, _
    ByVal strPriSourceFileName As String, _
    ByVal strPriSourceFolderPath As String, _
    ByVal strPriDestinationFolderPath As String, _
    ByVal intPriRowNberToStartAt As Integer, _
    ByVal intPriRowNberToFinishAt As Integer)

        Dim strPriFileName As String = ""
        Dim intPriCurrentRowNberWithinTextFile As Integer = 1

            Dim sr As StreamReader
            Dim floPriPctOfTaskDone As Single = 0
            Dim intPriNbrOfFilesToBeCopied As Integer = 0

            intPriNbrOfFilesToBeCopied = intPriRowNberToFinishAt - intPriRowNberToStartAt + 1

            Console.WriteLine(intPriNbrOfFilesToBeCopied & " Files to be copied. From the row number : " & intPriRowNberToStartAt & " to the row number : " & intPriRowNberToFinishAt)

            sr = File.OpenText(strPriSourceFileFolderPath & "\" & strPriSourceFileName)

            ' Do
        Do While sr.Peek() >= 0

            Try
                strPriFileName = sr.ReadLine()
                ' get the filename
                Select Case intPriCurrentRowNberWithinTextFile
                    Case intPriRowNberToStartAt To intPriRowNberToFinishAt
                        ' the file is being copied only if intPriCurrentRowNberWithinText is in between > intPriNbrRowsTextFile
                        ' copy the corresponding file
                        Select Case File.Exists(strPriDestinationFolderPath & "\" & strPriFileName)
                            Case Is = True
                                Console.WriteLine("The file :" & strPriFileName & " has been already copied")
                                ' increment intPriCurrentRowNberWithinText
                                intPriCurrentRowNberWithinTextFile += 1
                            Case Else
                                'Console.WriteLine("{0} already exists.", strFileA)
                                File.Copy(strPriSourceFolderPath & "\" & strPriFileName, strPriDestinationFolderPath & "\" & strPriFileName)
                                ' udpate the progress rate
                                floPriPctOfTaskDone = (intPriCurrentRowNberWithinTextFile / intPriNbrOfFilesToBeCopied) * 100
                                Console.WriteLine(strPriFileName & _
                                strPriAddSpacesOnDisplay(strPriFileName, strPriSourceFileFolderPath, strPriSourceFileName) & _
                                " has been copied," & Format(Round(floPriPctOfTaskDone, 1), "#0.0") & "% of job processed")
                                subPriFilesDealtReports(strPriSourceFileFolderPath, strPriFileName, True)
                        End Select
                    Case Else
                End Select
                ' increment intPriCurrentRowNberWithinText
                intPriCurrentRowNberWithinTextFile += 1

            Catch
                ' exit in case a file exception has been caught
                Console.WriteLine("The File :" & strPriFileName & " to be copied from has not been found..")
                subPriFilesDealtReports(strPriSourceFileFolderPath, strPriFileName, False)
                Select Case intPriCurrentRowNberWithinTextFile
                    Case intPriRowNberToStartAt To intPriRowNberToFinishAt
                        ' increment intPriCurrentRowNberWithinText
                        intPriCurrentRowNberWithinTextFile += 1
                    Case Else
                End Select
            End Try

        Loop
        ' end of loop
        sr.Close()

    End Sub

    Public Sub subPriFilesDealtReports(ByVal strPriSourceFileFolderPath As String, ByVal strPriFileName As String, ByVal BooPriFileStatus As Boolean)

        Select Case BooPriFileStatus
            Case Is = True
                ' if the file has been found, its name is being copied within the SavedFiles text file
                Using sw As StreamWriter = File.AppendText(strPriSourceFileFolderPath & "\" & "SavedFiles.txt")
                    ' Add some text to the file.
                    sw.WriteLine(strPriFileName)
                    ' Arbitrary objects can also be written to the file.
                    sw.Close()
                End Using
            Case Is = False
                ' if the file has not been found, its name is being copied within the NotFoundFiles text file
                Using sw As StreamWriter = File.AppendText(strPriSourceFileFolderPath & "\" & "NotFoundFiles.txt")
                    ' Add some text to the file.
                    sw.WriteLine(strPriFileName)
                    ' Arbitrary objects can also be written to the file.
                    sw.Close()
                End Using

        End Select

    End Sub

End Module

Conclusion :


L'activation de 'QuickEdit mode', accessible lors de l'execution de l'application compilée, par un click sur la barre de titre, puis sur le boutton 'propriétés' permet de copier coller les différents chemins d'accès. Ce qui permet une bien moindre pénébilité lors du passage de paramètres.
Pour un affichage plus agréable de l'application console, modifiez à cette occasion les paramètres d'affichage de la console avec :
- screen buffer size de 120 x 30
- windows size de 120 x 50
- window preview de 8 x 12, police Raster fonts, taille 8 x 12
- Screen text : RGB : 0,128,128
- Screen color : RGB : 0,255,0
Annotation : le dossier destination doit être existant, dans le cas contraire la copie ne se fait pas;

A voir également

Ajouter un commentaire

Commentaires

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
48
La discussion sur ce sujet s'arrête ici, merci de votre compréhension.
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1
Une de mes sources montre que OneHacker n'a JAMAIS tort lol, meme apres une innondation d'arguments PERTINENTS... laissez tomber!
Messages postés
1447
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1
DIEUZORRO : Si je serait étonné si on me fait des remarques, je fait pas joujou et j'ai bien dit que c'était rare les cas ou on peut pas faire de condition ou while ou autre.

ALLTHEW3 : Je crois que c'est plutôt toi qui est de mauvaise fois mais si tu sais toujours pas à quoi sert le GOTO tant pis pour toi.
Messages postés
552
Date d'inscription
samedi 8 janvier 2005
Statut
Membre
Dernière intervention
12 avril 2008
1
lol seul contre tous, il croit encore avoir raison ...
pire que de la mauvaise foi ^^

Goto End (jamais utilisé de goto de ma vie : je sais même pas si c'est bon)
Messages postés
21
Date d'inscription
jeudi 6 janvier 2005
Statut
Membre
Dernière intervention
14 janvier 2008

Moi je ne suis pas un petit géni et la programmation c'est mon métier et le Goto c'est à proscrire et on peut toujours s'en sortir avec une avec une condition. S'il est préservé c'est pour permettre de garder une certaine compatibilité et pour permettre de faire de la programmation vite fait (mal fait). Et quand on développe à plusieurs passer sur du code développé par une autre personne où il y a des sauts de partout c'est la galère à débuguer. Bref il y a des règles de bonne programmation qu'il ne faut pas ignorer. Mais tu peux continuer à faire joue joue sur tout PC mais ne t'étonne pas d'avoir des remarques sur ton code quand tu le publie.
Afficher les 29 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.