有没有办法找出NSIS中字符串的长度?
我正在尝试测试文件是否为空(没有内容)。一种方法是读取文件并将内容存储在一个字符串(称为contentStr)中,然后查看该contentStr字符串的长度。如果是> 0然后它不是空的。
另一种方法是检查contentStr ==“”是否如下所示,它不起作用。任何空文件永远不会返回1:
!macro IsFileEmpty fName res
!insertmacro ReadFile "${fName}" ${res}
StrCmp ${res} "" +1 +2
IntOp ${res} 1 + 0
IntOp ${res} 0 + 0
!macroend
答案 0 :(得分:5)
答案 1 :(得分:2)
你检查过文件大小真的是0字节吗?也许你的文件有空格或换行符......在这种情况下你需要StrRep或修剪你的字符串。
如果您只想知道文件大小,可以使用此宏和功能:
!macro FileSize VAR FILE
Push "${FILE}"
Call FileSizeNew
Pop ${VAR}
!macroend
Function FileSizeNew
Exch $0
Push $1
FileOpen $1 $0 "r"
FileSeek $1 0 END $0
FileClose $1
Pop $1
Exch $0
FunctionEnd
更多信息:
答案 2 :(得分:1)
这样做有点奇怪,它只是部分有效:
...
StrCmp ${res} "" 0 +2 ; +1 and 0 is the same, jumps to next instruction
StrCpy ${res} 1 ; No need to do math here
IntOp ${res} ${res} + 0 ; NaN + 0 = 0 but what if you read a number from the file?
如果文件可能以数字开头,则需要像zbynour建议一样跳转:
...
StrCmp ${res} "" 0 +3
StrCpy ${res} 1
Goto +2
StrCpy ${res} 0
如果你翻转测试,你可以用相同数量的指令得到你想要的东西:
!macro IsFileNOTEmpty fName res
!insertmacro ReadFile "${fName}" ${res}
StrCmp ${res} "" +2 0
StrCpy ${res} 1 ; Or IntOp ${res} ${res} | 1 if you really wanted to do extra math ;)
IntOp ${res} ${res} + 0
!macroend
甚至更好:
!macro IsFileEmpty fName res
!insertmacro ReadFile "${fName}" ${res}
StrLen ${res} ${res} ; If this is enough depends on how you want to deal with newlines at the start of the file (\r or \n)
!macroend
...所有这些代码假设您要测试文件是否以某些文本开头,如果文件以0字节开头,则始终表示该文件为空。因此,如果文件具有二进制内容,则需要使用Francisco R的代码来测试实际大小(以字节为单位)。
答案 3 :(得分:0)
那是因为总是执行最后一行(如果${res}
为空,则偏移量为+1
,但不会跳过下一条指令。
以下代码应使其按预期运行:
!macro IsFileEmpty fName res
!insertmacro ReadFile "${fName}" ${res}
StrCmp ${res} "" +1 +3
IntOp ${res} 1 + 0
goto end
IntOp ${res} 0 + 0
end:
!macroend