Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nsis 如何在不删除特定子目录的情况下递归删除目录内容_Nsis - Fatal编程技术网

Nsis 如何在不删除特定子目录的情况下递归删除目录内容

Nsis 如何在不删除特定子目录的情况下递归删除目录内容,nsis,Nsis,我正在NSIS中为我的游戏编写安装程序/卸载程序。我的游戏支持自定义MOD,我想在不稳定期间删除自定义MOD或不删除自定义MOD时提供一个选项。现在是棘手的部分:mod被放在$INSTDIR的子目录中。所以,若用户有一些mod要保留,我想删除子mod目录旁边的所有内容(所以我不能使用普通的oldRMdir/R) 我想保留的文件就是这样的结构: $INSTDIR/Modules/[anything-but-Base] $INSTDIR/Modules/Base/Submod 例如,如果用户决定保

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

我想保留的文件就是这样的结构:

$INSTDIR/Modules/[anything-but-Base]
$INSTDIR/Modules/Base/Submod
例如,如果用户决定保留其mods,我希望保留目录:

$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目录并删除所有其他内容)

只删除文件怎么样

我想在安装过程中,您可以执行以下操作:

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

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

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


最后一个问题:没有游戏的MOD不是没有用吗?我认为它们不会起作用…

有这样一个:NSIS wiki上的代码片段,我能够根据自己的使用进行调整(忘记了NSIS wiki)。基本上,我的核心问题是交替使用/和\而这些在NSIS中没有相同的含义

我的所有资产都存储为普通数据(png/ogg/xml),因此需要安装很多单独的文件。更不用说在卸载过程中可能会添加一些需要删除的文件的补丁了。而且real uninstall也提供了删除mod文件的选项,我只是不想通过默默地强制删除用户可能从各种internet来源收集的文件,并希望保留这些文件/将其移动到另一台计算机,然后将mods文件夹备份到$TEMP目录,使用RMDir/r删除所有内容,然后复制/创建文件夹。
SetOutDir $INSTDIR
File "*.*"
SetOutDir $INSTDIR
File "1"
File "2"
File "3"
File "4"
File "n"