C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

不要なものを除去しつつフォルダのコピー

innoSetupでインストーラーを作成する際に面倒な為、
フォルダを指定しているのですが、当然不要なフォルダーや
ファイルまでもがインストーラーに入ってしまいます。

別に動作には影響ないのですが、要らないものを配布するのも
気が引けるので、何とかします。

試していないのですが、innoSetupはインストーラを作成する
前後にプログラムを実行することが出来るっぽいので、
作戦としては、
・不要なものを除去しつつフォルダのコピー
・コピーしたフォルダを元にインストーラー作成
・コピーしたフォルダを削除
だと手間が省けそうな気がしてます。

で、表題の処理を行うスプリクトを作りました。
何で作るべきか悩みましたが、VBScriptにしました。

'必要なものでだけのフォルダーコピー
call Main()

sub Main()
    removeFolderNames = array(".vscode", "temp", "__pycache__")
    removeFileNames = array(".env")

    targetDir = "Fusion360_NEKONOTE\NEKONOTE"
    tempDir = getTempPath()

    'copy
    Call copyFolder(targetDir, tempDir)

    'get remove folder&file
    Dim removeLst
    Set removeLst = CreateObject("System.Collections.ArrayList")
    for idx = 0 to ubound(removeFolderNames)
        removeLst.AddRange(getFolderPaths(tempDir & "\NEKONOTE", removeFolderNames(idx)))
    next
    for idx = 0 to ubound(removeFileNames)
        removeLst.AddRange(getFilePaths(tempDir & "\NEKONOTE", removeFileNames(idx)))
    next

    'remove folders
    call execRemove(removeLst)
end sub

sub execRemove(lst)
    On Error Resume Next
    for each path in lst
        path.Delete
    next
end sub

'return ArrayList
function getFilePaths(path, removeName)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)

    Dim stack
    Set stack = CreateObject("System.Collections.ArrayList")
    call stack.add(folder)

    dim lst
    Set lst = CreateObject("System.Collections.ArrayList")

    Do Until stack.Count = 0
        set folder = stack.item(0)
        for each f in folder.Files
            if f.Name = removeName then
                lst.add(f)
            end if
        next
        for each sf in folder.SubFolders
            stack.add(sf)
        next
        stack.RemoveAt(0)
    loop

    set getFilePaths = lst
end function

'return ArrayList
function getFolderPaths(path, removeName)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)

    Dim stack
    Set stack = CreateObject("System.Collections.ArrayList")
    call stack.add(folder)

    dim lst
    Set lst = CreateObject("System.Collections.ArrayList")

    Do Until stack.Count = 0
        set folder = stack.item(0)
        for each sf in folder.SubFolders
            if sf.Name = removeName then
                lst.add(sf)
            else
                stack.add(sf)
            end if
        next
        stack.RemoveAt(0)
    loop

    set getFolderPaths = lst
end function

sub copyFolder(targetDir, tempDir)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Call fso.CopyFolder(targetDir, tempDir)
end sub

function getTempPath()
    Set fso = CreateObject("Scripting.FileSystemObject")
    getTempPath = fso.GetSpecialFolder(2).Path & "\"
end function

正確には、フォルダを丸ごとコピーして、不要なファイル・フォルダ
をチマチマ削除してます。

アドイン完成しているのに、それ以外の部分で手間取っている。