0

必要な特定のファイルをあるフォルダーから別のフォルダーにコピーするプログラムを作成しています。ただし、特定の基準に適合するファイルのみをコピーする必要があります。より具体的には、次のような配列に保存されている禁止ファイル、禁止拡張子、または禁止フォルダー リストにないファイルのみをコピーする必要があります。

Public BannedExtensions As String() = {".bak", ".bak2", ".cry", ".max", ".psd", 
       "log", ".lib", "pdb", ".exp"}
Public BannedFolders As String() = {"Tools", "Editor", "Code", "LogBackups",
       "statoscope", "BinTemp", "USER", "rc"}
Public BannedFiles As String() = {"Editor.exe", "error.bmp", "error.dmp", 
       "luac.out", "tags.txt"}

次に、コードはそれらを一時ディレクトリに移動し、圧縮してFile_Name変数に保存されている場所に保存する必要があります。

これは私のコード全体です:

Option Strict On
Public Class Form1

    'define the two variables used for tracking file name and where to save'
    Private Property Root_Folder As String
    Private Property File_Name As String

    'define the variable which dictates wether we copy the file
    Private Property copy As Boolean

    'define which files we need and do not need'
    Public BannedExtensions As String() = {".bak", ".bak2", ".cry", ".max", ".psd", "log", ".lib", "pdb", ".exp"}
    Public BannedFolders As String() = {"Tools", "Editor", "Code", "LogBackups", "statoscope", "BinTemp", "USER", "rc"}
    Public BannedFiles As String() = {"Editor.exe", "error.bmp", "error.dmp", "luac.out", "tags.txt"}

    Function Copy_RequiredFiles() As Integer
        Dim i As Integer = 0

        'Searches directory and it's subdirectories for all files, which "*" stands for
        'Say for example you only want to search for jpeg files... then change "*" to "*.jpg"  
        For Each filename As String In IO.Directory.GetFiles(Root_Folder, "*", IO.SearchOption.AllDirectories)

            copy = True

            Dim fName As String = IO.Path.GetFileName(filename)
            Dim fExtension As String = IO.Path.GetExtension(filename)
            Dim fFolder As String = IO.Path.GetDirectoryName(filename)

            For i = 0 To BannedExtensions.Length - 1
                If fExtension = BannedExtensions(i) Then
                    RichTextBox1.Text = RichTextBox1.Text & vbNewLine & "Extension: " & filename
                    copy = False
                End If
            Next
            If copy = True Then
                i = 0
                For i = 0 To BannedFolders.Length - 1
                    If filename = BannedFolders(i) Or BannedFolders(i).Contains(filename) Then
                        RichTextBox1.Text = CStr(CBool(RichTextBox1.Text & vbNewLine & "Folder: " &
                        copy) = False)
                    End If
                Next
                If copy = True Then
                    i = 0
                    For i = 0 To BannedFiles.Length - 1
                        If filename = BannedFolders(i) Or BannedFolders(i).Contains(filename) Then
                            RichTextBox1.Text = RichTextBox1.Text & vbNewLine & "Folder: " & filename
                            copy = False
                        End If
                    Next
                End If
            End If
            If copy = True Then
                'copy the file into the selected folder'
            End If
        Next
        Return 0
    End Function

    'when the browse button for selecting the folder is selected'
    Private Sub Browse_Root_Click(sender As Object, e As EventArgs) Handles Browse_Root.Click
        'check if the folder dialogue has been opened successfully and something has been selected'
        If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then '
            'set the textbox and the previously defined variable to the folder selected'
            TextBox1.Text = FolderBrowserDialog1.SelectedPath
            Root_Folder = FolderBrowserDialog1.SelectedPath
        End If
    End Sub

    'when the browse button for where to save the file is selected'
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'set the options to limit the save type to a zip file'
        SaveFileDialog1.Filter = "zip files (*.zip)|*.zip"
        'check that the dialogue box has opened succesfully'
        If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
            'set the text box and the previously defined variable to the file selected'
            TextBox2.Text = SaveFileDialog1.FileName()
            File_Name = SaveFileDialog1.FileName()
        End If
    End Sub

    'when the user changes the value of the textbox update the folder to select from'
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        Root_Folder = TextBox1.Text
    End Sub

    'when the user changes the value of the textbox update the file to save to'
    Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
        File_Name = TextBox2.Text
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Copy_RequiredFiles()
    End Sub
End Class


'when the browse button for selecting the folder is selected'
Private Sub Browse_Root_Click(sender As Object, e As EventArgs) Handles Browse_Root.Click
    'check if the folder dialogue has been opened successfully and something has been selected'
    If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then '
        'set the textbox and the previously defined variable to the folder selected'
        TextBox1.Text = FolderBrowserDialog1.SelectedPath
        Root_Folder = FolderBrowserDialog1.SelectedPath
    End If
End Sub

'when the browse button for where to save the file is selected'
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'set the options to limit the save type to a zip file'
    SaveFileDialog1.Filter = "zip files (*.zip)|*.zip"
    'check that the dialogue box has opened succesfully'
    If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
        'set the text box and the previously defined variable to the file selected'
        TextBox2.Text = SaveFileDialog1.FileName()
        File_Name = SaveFileDialog1.FileName()
    End If
End Sub

'when the user changes the value of the textbox update the folder to select from'
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    Root_Folder = TextBox1.Text
End Sub

'when the user changes the value of the textbox update the file to save to'
Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
    File_Name = TextBox2.Text
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Copy_RequiredFiles()
End Sub
End Class

いくつか質問があります。

まず、プログラムを実行してファイルを印刷すると、コピーしてはならないことがわかったのに、ループ内の 2 番目または 3 番目の if ステートメントから何も表示されないのはなぜですか。

2 つ目は、一時ファイルにコピーするときにフォルダー構造を保持する方法です。

3 つ目は、この一時フォルダーを圧縮する最善の方法は何かということです。

前もって感謝します、マーカス

4

1 に答える 1

1

1 つの方法は、List でカスタム クラスを使用して情報を保存することです。

Class myFile
   ' to do all the things you want ("preserve folder struct"),
   ' you need more than a name in a textbox:
   Public Property FileName As String
   Public Property FileExt As String
   Public Property PathName As String

   ' cant create a new obj without the essential info
   Public Sub New(fName As String, fExt as String, pName As String)
      FileName = fName
      FileExt = fExt
      PathName = pName
   End SUb

End Class

または、ホイールを再作成するのではなくSystem.IO.FileInfo、ファイルを反復する方法を使用および変更します。次に、これらのものを格納するリスト:

Friend myFileList As List(of myFile)
' or
Friend myFileList As List(of FileInfo)

List(of myFile) への保存を繰り返すには:

Dim myF As MyFile
For Each filename As String In IO.Directory.GetFiles

    ' if BannedFiles is a List(Of String) instead of an array:
    If BannedFiles.Contains(f.Extension) = False Then
         ' create NEW file object with the info 
         myF = New MyFile(IO.Path.GetFileName(filename),
                          IO.Path.GetExtension(filename),
                          IO.Path.GetDirectoryName(filename))
         ' add to the list of files to do
         myFileList.Add(f)
    End If

    If myFileList.Contains(f) = False Then         ' better version of Copy=true
        For n As Integer = 0 To BannedFoldersLIST.Count - 1
           If f.FullPath.Contains(BannedFoldersLIST(n)) = False Then

              ' create a new file object as above
                myFileList.Add(f)              ' add for folder ban
           End If
        Next n
    End If

    ' repeat for banned extensions  (watch out for "." vs no dot)

   Return myFileList             ' mine is a function returning
                                 ' a List(Of T) to be processed elsewhere

これは、コピーして貼り付けるコードよりも概念的です。結果に対していくつかのことをしたいので、それらを TextBox 以外に保存することをお勧めします。VS は、マウスでリストの内容を喜んで表示します。

フォルダ テストは、禁止文字列が完全な名前か部分的な名前かによって作業が必要になります。.Containsより大きなポイントは、リスト オブジェクトは、グローバル フラグではなくアイテムを既に格納しているかどうかを教えてくれるということです。またはのいずれList(Of FileInfo)List(Of myFileClass)が機能します。後者は、あなたが持っているコードをより多く保持します。

于 2014-05-16T13:39:34.353 に答える