获取字符串长度

时间:2012-12-19 09:37:14

标签: installer nsis

有没有办法找出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

4 个答案:

答案 0 :(得分:5)

要获得字符串长度,请使用StrLen

StrLen $0 "123456" # ==> $0 = 6

如果你想在尝试阅读之前获取文件大小,请在另一个答案中查看Francisco指出的技术。

答案 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

更多信息:

http://nsis.sourceforge.net/Getting_File_Size

答案 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