【问题标题】:How to recursivly delete directory contents without deleting specific subdirectory如何在不删除特定子目录的情况下递归删除目录内容
【发布时间】:2014-04-11 00:06:23
【问题描述】:

我正在为我的游戏在 NSIS 中编写安装程序/卸载程序。我的游戏支持自定义模组,我想在卸载期间删除自定义模组时提供一个选项。现在是棘手的部分:mods 被放在$INSTDIR 的子目录中。因此,如果用户要保留一些模组,我想删除该子模组目录旁边的所有内容(所以我不能使用普通的旧 RMdir /R)。

我要保留的文件是这种结构:

$INSTDIR/Modules/[anything-but-Base]
$INSTDIR/Modules/Base/Submod

例如,如果用户决定保留他的模组,我想保留目录:

$INSTDIR/Modules/Base/Submod/Sample1
$INSTDIR/Modules/Base/Submod/Sample2
$INSTDIR/Modules/Base/Submod
$INSTDIR/Modules/Sample3
$INSTDIR/Modules/Sample4

并从$INSTDIR 中删除所有其他内容,包括空目录

我尝试过这样做:

FindFirst $R0 $R1 "$INSTDIR\Modules\Base\*.*"
Loop:
    StrCmp $R1 "" Done
    StrCmp $R1 "Submod" DeleteSubMods
    Goto DeleteCoreMod
    DeleteSubMods:
        RMdir "$INSTDIR/Modules/Base/Submod" ; Remove only if empty
        Goto FindNextItem
    DeleteCoreMod:
        RMdir /R "$INSTDIR/Modules/Base/$R1" ; Remove always
    FindNextItem:
    FindNext $R0 $R1
    Goto Loop
Done:
FindClose $0

RMdir "$INSTDIR/Modules/Base" ; Only if empty
RMdir "$INSTDIR/Modules" ; Only if empty

FindFirst $R0 $R1 "$INSTDIR\*.*"
Loop2:
    StrCmp $R1 "" Done2
    StrCmp $R1 "Modules" FindNextItem2 ; Remove everything but Modules
        RMdir /R "$INSTDIR/$R1"
        Delete "$INSTDIR/$R1"
    FindNextItem2:
    FindNext $R0 $R1
    Goto Loop2
Done2:
FindClose $0

但这并没有让我得到正确的结果(它留下空的 $INSTDIR/Modules 目录并删除其他所有内容)

【问题讨论】:

    标签: nsis


    【解决方案1】:

    只删除你的文件怎么样?

    我想在安装过程中您会执行 A) 之类的操作

    SetOutDir $INSTDIR
    File "*.*"
    

    如何一一创建所有文件的列表 B)

    SetOutDir $INSTDIR
    File "1"
    File "2"
    File "3"
    File "4"
    File "n"
    

    在 B) 情况下,为卸载程序创建相同的列表(在卸载部分)。 因此,只有您的文件将被删除,而 mod 文件保持不变。

    使用 RMdir(不带 /r)删除目录 - 只有当它们完全为空时才会删除它们,这样您的 mod 才会被保留。

    最后一个问题:没有游戏的模组不是没用吗?我认为他们不会工作......

    【讨论】:

    • 我的所有资产都存储为纯数据 (png/ogg/xml),因此需要安装很多单独的文件。更不用说可能会添加一些在卸载过程中也需要删除的文件的补丁。真正的卸载也提供了删除 mod 文件的选项,我只是不想通过默默地强制删除他/她可能从各种互联网来源收集的文件并希望保留它们/移动到另一台计算机来惹恼用户
    • 然后将 mods 文件夹备份到 $TEMP 目录,使用 RMDir /r 删除所有内容并复制/创建文件夹。
    【解决方案2】:

    有这个:http://nsis.sourceforge.net/Delete_dirs_/_files_in_a_directory_except_one_dir_/_filesn-p 在 NSIS wiki,我能够将它改编为我自己的使用(忘记了 NSIS wiki)。基本上核心问题是我可以互换使用 / 和 \,而这些在 NSIS 中没有相同的含义

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      相关资源
      最近更新 更多