0

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

4 回答 4

5

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

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

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

于 2012-12-19T11:36:19.620 回答
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

于 2012-12-19T10:21:16.210 回答
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 的代码来测试实际大小(以字节为单位)。

于 2012-12-20T03:38:35.790 回答
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
于 2012-12-19T10:23:54.147 回答