ファイル名置換プログラムのソース Radioserver 12

36進数対応
Public Class RCmain
    Dim filepath(10000) As String 'ファイル指定変換の場合のファイルパス格納用
    Dim dirpath As String 'フォルダ指定変換のフォルダパス
    Dim filenum As Integer 'ファイルの数
    Dim timetable(10000, 3) As String '設定ファイルを格納する
    Dim beffname(10000) As String '変換前のファイル名
    Dim aftfname(10000) As String '変換後ファイル名
    Dim temptable(10000, 3) As String 'ファイル名から計算された時間とか
    Dim kouhotable(10, 3) As String '変換名候補用
    Dim tempnum As Integer 'ファイル指定時のファイル数一時保管用
    Dim jikanindex As Integer '時間管理用 どのタイムテーブルか
    Dim getindex As Integer 'どの変換ルートか
    Dim ttfile As String 'タイムテーブルファイル名を格納
    Dim year As Integer
    Dim month As Integer
    Dim day As Integer
    Dim hour As Integer
    Dim minu As Integer

    Private Sub Bdirget_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bdirget.Click
        'フォルダを指定して全ファイルを名前変換
        'フォルダダイアログを出してディレクトリパスを取得する

        ' FolderBrowserDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない)
        Dim FolderBrowserDialog1 As New FolderBrowserDialog()

        ' ダイアログの説明を設定する
        FolderBrowserDialog1.Description = "RS12録音ファイル保存フォルダ"

        ' ルートになる特殊フォルダを設定する (初期値 SpecialFolder.Desktop)
        FolderBrowserDialog1.RootFolder = System.Environment.SpecialFolder.MyComputer

        ' 初期選択するパスを設定する
        'FolderBrowserDialog1.SelectedPath = "C:\Program Files\"

        ' [新しいフォルダ] ボタンを表示する (初期値 True)
        FolderBrowserDialog1.ShowNewFolderButton = False

        ' ダイアログを表示し、戻り値が [OK] の場合は、選択したディレクトリを表示する
        If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
            TBDirpath.Text = FolderBrowserDialog1.SelectedPath

            '-------以下フォルダからファイルを取得する-------
            '指定フォルダのファイルをすべて取得
            Dim files As String() = System.IO.Directory.GetFiles( _
                 TBDirpath.Text, "*.mp3", System.IO.SearchOption.AllDirectories)

            Dim i As Integer

            'ファイル数を取得し変換前名前変数、リストに追加
            i = UBound(files)

            For i = 0 To UBound(files)
                beffname(i) = Dir(files(i))
                ListkouhoFile.Items.Insert(i, beffname(i))
            Next i

            filenum = UBound(files)
        End If

        ' 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照)
        FolderBrowserDialog1.Dispose()
        Bnamech.Enabled = True
    End Sub

    Private Sub Bfileget_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bfileget.Click
        'ファイルダイアログを出してファイルを選択 同じフォルダにあるファイルなら複数選択可
        'フォルダを変えた場合でも変換できるようパスとファイル名を結びつける

        ' OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない)
        Dim OpenFileDialog1 As New OpenFileDialog()

        ' ダイアログのタイトルを設定する
        OpenFileDialog1.Title = "録音ファイル指定"

        ' 初期表示するディレクトリを設定する
        OpenFileDialog1.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments

        ' 初期表示するファイル名を設定する
        'OpenFileDialog1.FileName = "初期表示するファイル名をココに書く"

        ' ファイルのフィルタを設定する
        OpenFileDialog1.Filter = "録音ファイル|*.mp3;*.MP3"

        ' ファイルの種類 の初期設定を 2 番目に設定する (初期値 1)
        OpenFileDialog1.FilterIndex = 2

        ' ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 False)
        OpenFileDialog1.RestoreDirectory = True

        ' 複数のファイルを選択可能にする (初期値 False)
        OpenFileDialog1.Multiselect = True

        ' [ヘルプ] ボタンを表示する (初期値 False)
        OpenFileDialog1.ShowHelp = True

        ' [読み取り専用] チェックボックスを表示する (初期値 False)
        'OpenFileDialog1.ShowReadOnly = True

        ' [読み取り専用] チェックボックスをオンにする (初期値 False)
        'OpenFileDialog1.ReadOnlyChecked = True

        ' 存在しないファイルを指定した場合は警告を表示する (初期値 True)
        'OpenFileDialog1.CheckFileExists = True

        ' 存在しないパスを指定した場合は警告を表示する (初期値 True)
        'OpenFileDialog1.CheckPathExists = True

        ' 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 True)
        'OpenFileDialog1.AddExtension = True

        ' 有効な Win32 ファイル名だけを受け入れるようにする (初期値 True)
        'OpenFileDialog1.ValidateNames = True

        ' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            ' Multiselect が True の場合はこのように列挙する
            For Each nFileName As String In OpenFileDialog1.FileNames
                filepath(tempnum) = IO.Path.GetDirectoryName(nFileName)
                beffname(tempnum) = Dir(nFileName)
                ListkouhoFile.Items.Insert(filenum, beffname(tempnum))
                tempnum = tempnum + 1
            Next nFileName
        End If
        filenum = tempnum - 1

        ' 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照)
        OpenFileDialog1.Dispose()
        Bnamech.Enabled = True
    End Sub

    Private Sub Bnamech_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bnamech.Click
        Dim year2 As String
        Dim month2 As String
        Dim week As String
        Dim weekd(7) As String
        Dim day2 As String
        Dim sec As Integer
        Dim hour2 As String
        Dim minu2 As String
        Dim getname(7) As String
        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim l As Integer
        Dim intFileNo As Integer
        Dim templine As String
        Dim kakunouline As String
        Dim bname As String
        Dim tempname1 As String
        Dim tempname2 As String
        Dim ni As Integer
        Dim nj As Integer
        Dim toridashi As String


        'ダブルクリック禁止
        Bnamech.Enabled = False

        'タイムテーブルを読み込む ここから
        '使用可能なファイルナンバーを取得
        intFileNo = FreeFile()
        l = 0
        'カレントディレクトリを実行ディレクトリに
        ChDir(System.IO.Path.GetDirectoryName(Application.ExecutablePath))

        FileOpen(intFileNo, ttfile, OpenMode.Input)
        '行で取ってきたテキストを連結して分割
        While Not EOF(intFileNo)

            templine = ""
            kakunouline = LineInput(intFileNo)
            For j = 0 To kakunouline.Length - 1
                templine = templine & kakunouline(j)
            Next j
 
            timetable(l, 0) = Split(templine, ",")(0)
            timetable(l, 1) = Split(templine, ",")(1)
            timetable(l, 2) = Split(templine, ",")(2)
            timetable(l, 3) = Split(templine, ",")(3)

            l = l + 1
        End While

        FileClose(intFileNo)
        'タイムテーブル読み込みここまで

        'ファイル名を一個づつ変換していく ここから
        For j = 0 To filenum

            '--機種依存部分 ここから--
            '<録音ファイル名取得部分 ここから>
            For i = 0 To 7
                'ファイル名を一文字ずつ取り出す
                getname(i) = beffname(j).Substring(i, 1)
                If IsNumeric(getname(i)) = False Then
                    '取り出したものがアルファベットだった場合
                    getname(i) = CStr(Asc(getname(i)) - 55)
                End If
            Next i
            'ファイル名取得ここまで

            'タイムスタンプ取得のためカレントディレクトリを変換フォルダに
            Select Case getindex
                Case 0 'フォルダ一括変換の場合
                    ChDir(TBDirpath.Text)
                Case 1 'ファイル指定変換の場合
                    ChDir(filepath(j))
            End Select

            '36進数の秒表示から時刻表示に
            sec = 36 ^ 3 * CInt(getname(4)) + 36 ^ 2 * CInt(getname(5)) + 36 * CInt(getname(6)) + CInt(getname(7))
            hour = sec \ 3600
            minu = (sec - hour * 3600) \ 60

            year = System.IO.File.GetLastWriteTime(beffname(j)).Year
            month = CInt(getname(1))
            day = CInt(getname(2) & getname(3))
            '--機種依存部分 ここまで--

            'タイムテーブル指定で時間を調整
            jikanteigi()

            '曜日設定 ここから
            week = Weekday(CDate(year & "/" & month & "/" & day))

            weekd(1) = "sun"
            weekd(2) = "mon"
            weekd(3) = "tue"
            weekd(4) = "wed"
            weekd(5) = "thu"
            weekd(6) = "fri"
            weekd(7) = "sat"

            week = weekd(week)
            '曜日設定ここまで

            'ファイル名用調整
            year2 = CStr(year).Substring(2, 2)

            If month < 10 Then
                month2 = "0" & CStr(month)
            Else
                month2 = CStr(month)
            End If

            If day < 10 Then
                day2 = "0" & CStr(day)
            Else
                day2 = CStr(day)
            End If

            If hour < 10 Then
                hour2 = "0" & CStr(hour)
            Else
                hour2 = CStr(hour)
            End If

            If minu < 10 Then
                minu2 = "0" & CStr(minu)
            Else
                minu2 = CStr(minu)
            End If

            temptable(j, 0) = year2 & month2 & day2
            temptable(j, 1) = week
            temptable(j, 2) = hour2 & minu2

            'タイムテーブルに登録されているかどうか
            For k = 0 To l - 1
                If timetable(k, 1) = temptable(j, 2) And timetable(k, 2) = temptable(j, 1) Then
                    kouhotable(0, 0) = timetable(k, 0) '名前
                    kouhotable(0, 1) = temptable(j, 2) '時刻
                    kouhotable(0, 2) = temptable(j, 1) '曜日
                    kouhotable(0, 3) = timetable(k, 3) 'ファイル名形式
                End If
            Next k

            '置換後ファイル名決定
            If kouhotable(0, 0) <> "" And kouhotable(0, 3) = "0" Then
                '番組名+年月日+曜日
                aftfname(j) = kouhotable(0, 0) & " " & temptable(j, 0) & " " & kouhotable(0, 2)
            ElseIf kouhotable(0, 0) <> "" And kouhotable(0, 3) = "1" Then
                '番組名+年月日
                aftfname(j) = kouhotable(0, 0) & " " & temptable(j, 0)
            Else
                '時刻+年月日+曜日
                aftfname(j) = temptable(j, 2) & " " & temptable(j, 0) & " " & temptable(j, 1)
            End If

            '候補データを空にする
            kouhotable(0, 0) = ""
            kouhotable(0, 1) = ""
            kouhotable(0, 2) = ""
            kouhotable(0, 3) = ""

            '重複ファイルチェック開始
            If j > 0 Then
                nj = Len(aftfname(j)) '今のファイルの文字数を保存
                tempname1 = aftfname(j) 'ループ処理のために名前を保存 固定文字列
                tempname2 = aftfname(j) 'ループ処理のために名前を一時保存
                For i = 0 To j - 1 '一個前のファイルまでループ処理、現在のファイルが一番新しいものとする前提
                    k = 0 'k初期化
                    ni = Len(aftfname(i)) '他のファイルの文字数を保存
                    If nj <= ni Then
                        toridashi = aftfname(i).Substring(0, nj) '他のファイルから今のファイル文字数分のファイル名を保存
                        If tempname1 = toridashi Then '連番以外の部分でファイル名が等しい
                            tempname2 = "" 'カウントアップ処理用にtempname2 初期化
                            If nj = ni Then '文字数が一緒であれば同名ファイル
                                tempname2 = aftfname(j) & " 2"
                                aftfname(i) = aftfname(i) & " 1"
                            Else '文字数が違っていればすでに同名ファイルが複数存在 カウントアップ
                                Do Until tempname2 = aftfname(i)
                                    tempname2 = tempname1 & " " & k
                                    k = k + 1
                                Loop
                                'ループで同じに名前になったものを+1した名前に
                                tempname2 = tempname1 & " " & k
                            End If
                        End If
                    End If
                Next i
                aftfname(j) = tempname2
            End If
            '重複ファイルチェック終了
        Next j
        'ファイル名変換ここまで

        'リストに登録 前のループに入れると同名ファイル処理の前にj番目のファイルは登録されている。スマートじゃないなぁ
        For j = 0 To filenum
            ListHenkan.Items.Insert(j, beffname(j) & "  ----->  " & aftfname(j) & ".MP3")
        Next
        MsgBox("準備完了")

        Select Case getindex
            Case 0 'フォルダ一括変換の場合
                Bdirget.Enabled = False
                Brenamef.Enabled = True
            Case 1 'ファイル指定変換の場合
                Bfileget.Enabled = False
                Brenamef.Enabled = True
        End Select
    End Sub

    Private Sub Brenamed_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        'ディレクトリ一括変換
        Dim i As Integer
        'Brenamed.Enabled = False

        ChDir(TBDirpath.Text)
        For i = 0 To filenum
            Rename(beffname(i), aftfname(i) & ".MP3")
        Next i
        MsgBox("ファイル名変換終了")
    End Sub

    Private Sub RCmain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        shokika()
        RadioButton1.Checked = True
        RBtimeset1.Checked = True
    End Sub

    Private Sub Brenamef_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Brenamef.Click
        'ファイル名変換
        Dim i As Integer
        'ダブルクリック防止
        Brenamef.Enabled = False
        Select Case getindex
            Case 0 'フォルダ一括変換
                ChDir(TBDirpath.Text)
                For i = 0 To filenum
                    Rename(beffname(i), aftfname(i) & ".MP3")
                Next i
                MsgBox("ファイル名変換終了")
            Case 1 'ファイル名変換
                For i = 0 To filenum
                    ChDir(filepath(i))
                    Rename(beffname(i), aftfname(i) & ".MP3")
                Next i
                MsgBox("ファイル名変換終了")
        End Select
    End Sub

    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
        'フォルダ一括変換
        Bdirget.Enabled = True
        'brenamed.Enabled = True
        Bfileget.Enabled = False
        Brenamef.Enabled = False
        getindex = 0
    End Sub

    Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
        'ファイル指定変換
        Bdirget.Enabled = False
        'Brenamed.Enabled = False
        Bfileget.Enabled = True
        'Brenamef.Enabled = True
        getindex = 1
    End Sub

    Private Sub RBtimeset1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBtimeset1.CheckedChanged
        '時間をずらす
        jikanindex = 0
        'カレントディレクトリを実行ディレクトリに
        ChDir(System.IO.Path.GetDirectoryName(Application.ExecutablePath))
        ttfile = "gyoukaitimetable.txt"
    End Sub

    Private Sub RBtimeset2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBtimeset2.CheckedChanged
        '時間そのまま
        jikanindex = 1
        'カレントディレクトリを実行ディレクトリに
        ChDir(System.IO.Path.GetDirectoryName(Application.ExecutablePath))
        ttfile = "realtimetable.txt"
    End Sub

    Sub jikanteigi()

        Select Case jikanindex
            Case 0
                '業界タイムテーブルへの変換
                If hour < 5 And day > 1 Then
                    day = day - 1
                    hour = hour + 24
                ElseIf hour < 5 And day = 1 And month <> 1 Then
                    '前の月になってしまう場合
                    month = month - 1
                    day = Date.DaysInMonth(year, month)
                    hour = hour + 24
                ElseIf hour < 5 And day = 1 And month = 1 Then
                    '1/1の場合
                End If
            Case 1
                'リアルタイム扱い 何もしない
        End Select
    End Sub
    Sub shokika()
        Dim i As Integer
        Dim j As Integer

        filenum = 0
        tempnum = 0
        TBDirpath.Text = ""
        ListHenkan.Items.Clear()
        ListkouhoFile.Items.Clear()
        'Erase filepath, timetable, kouhotable, temptable, beffname, aftfname
        For i = 0 To 10000
            filepath(i) = ""
            beffname(i) = ""
            aftfname(i) = ""
            For j = 0 To 3
                timetable(i, j) = ""
                temptable(i, j) = ""
            Next j
        Next i

        For i = 0 To 10
            For j = 0 To 3
                kouhotable(i, j) = ""
            Next j
        Next i

        Bnamech.Enabled = False
        'Brenamed.Enabled = False
        'Brenamef.Enabled = False

        Select Case getindex
            Case 0 'フォルダ一括変換の場合
                Bdirget.Enabled = True
                Brenamef.Enabled = False
            Case 1 'ファイル指定変換の場合
                Bfileget.Enabled = True
                Brenamef.Enabled = False
        End Select

    End Sub

    Private Sub Bcancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bcancel.Click
        shokika()
    End Sub
End Class