NSIS写入子目录内的APPDATA上的文件

时间:2014-10-18 20:05:35

标签: nsis

我试图将1行文本附加到$ APPDATA文件夹中的文件中,该文件夹位于随机生成的文件夹中,因此我不知道它是什么完整路径如:

C:\Users\MyUser\AppData\Roaming\MyApp\RANDOM_CRAP\config.json

虽然RANDOM_CRAP看起来像某个文件夹的随机字符串,例如G4F6Hh3L

我有什么选择?我需要使用Search For a File还是Search for a File or Directory (Alternative)我们认为 MyApp 文件夹的唯一子文件夹是 RANDOM_CRAP 文件夹,其中包含我要编辑的文件。

如果在没有搜索的情况下没有其他方法可以访问此文件,我已尝试过这样做,但无法使其正常工作。 (我对NSIS来说很新)

这是我尝试过的(使用替代方法):

Push "config.json"
Push "$APPDATA"
Push $0
GetFunctionAddress $0 "myCallback"
Exch $0
Push "1" ; include subfolders because my desired file is in the random folder
Push "0" ; no need the . option
Call SearchFile

我已经复制了SearchFile code from this post并进行了回调:

Function myCallback
    Exch 3
    Pop $R4
    MessageBox MB_OK "Callback executing!"
    MessageBox MB_OK "File is at : $R4"
FunctionEnd

我知道SearchFile正在运行(我已将MessageBox放入其中)但myCallback似乎没有被调用。

非常感谢。

1 个答案:

答案 0 :(得分:1)

如果您要查找已知文件且路径中只有一个目录未知,那么您可以进行基本的FindFirst搜索:

Section
; Create "random" folders:
CreateDirectory "$temp\MyApp\foo"
System::Call kernel32::GetTickCount()i.r1 ; random enough
CreateDirectory "$temp\MyApp\bar$1"
FileOpen $0 "$temp\MyApp\bar$1\config.json" a
FileWrite $0 '{bogus:"data"}$\n'
FileClose $0
CreateDirectory "$temp\MyApp\baz"

!include LogicLib.nsh
; Do the actual search:
StrCpy $9 "$temp\MyApp" ; The folder we are going to search in
FindFirst $0 $1 "$temp\MyApp\*"
loop:
    StrCmp $1 "" done
    ${If} ${FileExists} "$9\$1\config.json"
        DetailPrint "Found: $9\$1\config.json"
    ${EndIf}
    FindNext $0 $1
    Goto loop
done:
FindClose $0
SectionEnd