Nsis 如何读入字节数组文件内容,然后更新并写入另一个文件?

Nsis 如何读入字节数组文件内容,然后更新并写入另一个文件?,nsis,Nsis,我希望nsis能够将文件内容读入字节数组,更新数组,然后将缓冲区的内容写入另一个文件 我的代码 System::Call "kernel32::GetFileSize(i$0,i0)i.s" Pop $7 System::Alloc $7 ;Reading file contents into a buffer Pop $buffer System::Call "kernel32::ReadFile(i$0,i$buffer,i$7,*i.r6,i0)i.s" loop2:

我希望nsis能够将文件内容读入字节数组,更新数组,然后将缓冲区的内容写入另一个文件

我的代码

System::Call "kernel32::GetFileSize(i$0,i0)i.s"
Pop $7

System::Alloc $7  ;Reading file contents into a buffer
Pop $buffer
System::Call "kernel32::ReadFile(i$0,i$buffer,i$7,*i.r6,i0)i.s"

loop2:
        StrCpy $2 $buffer 1 $1
        StrCmp $2 '' end
        IntOp $1 $1 + 1

goto loop2
我希望能够遍历从文件中读取的字节数组,并能够更改其内容。(或者以字节为例)我想通过直接从文件中读取字节,然后将单个字节写入新文件来节省时间。这就是为什么要使用缓冲区字节数组分配。
可能吗?我看到nsis本机不支持数组。

nsis不支持字节数组,但系统插件结构语法允许您访问内存缓冲区中的原始字节:

!include LogicLib.nsh
!include Util.nsh
ShowInstDetails show

!macro DisplayTestFile
FileOpen $0 "$PluginsDir\Test.txt" r
FileRead $0 $1
FileClose $0
DetailPrint Line1=$1
!macroend

Section
InitPluginsDir
FileOpen $0 "$PluginsDir\Test.txt" w
${If} $0 P<> 0
    FileWrite $0 "HELLO World$\r$\n"
    FileClose $0
${EndIf}

!insertmacro DisplayTestFile

FileOpen $0 "$PluginsDir\Test.txt" a
${If} $0 P<> 0
    FileSeek $0 0 Set
    System::Call "KERNEL32::GetFileSize(pr0,p0)i.r1"
    ${IfThen} $1 = -1 ${|} Abort "Could not get file size" ${|}
    System::Call '*(&i$1,i0)p.r2' ; Allocate the file size + a zero terminator just in case
    ${If} $2 P<> 0
        System::Call "KERNEL32::ReadFile(pr0,pr2,ir1,*i,p0)i.r3"
        ${If} $3 <> 0
            ${For} $3 0 5 ; Change byte 0..5
                System::Call '*$2(&i$3,&i1.r4)' ; Read a byte
                IntOp $4 $4 | 32
                System::Call '*$2(&i$3,&i1 r4)' ; Write a byte
            ${Next}
            FileSeek $0 0 Set
            System::Call "KERNEL32::WriteFile(pr0,pr2,ir1,*i,p0)i.r3"
        ${EndIf}
        System::Free $2
    ${EndIf}
    FileClose $0
${EndIf}

!insertmacro DisplayTestFile
SectionEnd
!包括LogicLib.nsh
!包括Util.nsh
ShowInstDetails显示
!宏显示测试文件
文件打开$0“$PluginsDir\Test.txt”r
文件读取$0$1
文件关闭$0
DetailPrint Line1=$1
!宏端
部分
InitPluginsDir
文件打开$0“$PluginsDir\Test.txt”w
${If}$0 P 0
文件写入$0“HELLO World$\r$\n”
文件关闭$0
${EndIf}
!insertmacro DisplayTestFile
文件打开$0“$PluginsDir\Test.txt”a
${If}$0 P 0
FileSeek$0集
系统::调用“KERNEL32::GetFileSize(pr0,p0)i.r1”
${IfThen}$1=-1${{124;}中止“无法获取文件大小”${{124;}
系统::调用“*(&i$1,i0)p.r2”;分配文件大小+零终止符,以防万一
${If}$2p0
系统::调用“KERNEL32::ReadFile(pr0,pr2,ir1,*i,p0)i.r3”
${If}$3 0
${For}$3.05;更改字节0..5
系统::调用“*$2(&i$3,&i1.r4)”;读一个字节
投入4美元4 | 32
系统::调用“*$2(&i$3,&I1R4)”;写一个字节
${Next}
FileSeek$0集
系统::调用“KERNEL32::WriteFile(pr0,pr2,ir1,*i,p0)i.r3”
${EndIf}
系统::免费2美元
${EndIf}
文件关闭$0
${EndIf}
!insertmacro DisplayTestFile
分段结束

你问了一大堆问题,但没有将其中任何一个标记为已回答,我为什么要在这里回答你的问题?嗨@Anders,这不是故意的。我会马上解决这个问题。有没有办法将评论标记为“已回答的”?如果答案正确,则将其标记为已回答。如果他们不正确,你应该添加评论,并尝试在最后得到一个有效的解决方案。谢谢@Anders。我会确保我会处理好上述事宜。。你是否有可能实现我在问题中提出的要求?谢谢@Anders。代码工作起来很有魅力。不过有一个问题。如果我测试一个1兆字节的文件以在缓冲区上迭代,则需要很长时间。有没有办法让它更快?没有,没有系统插件(插件调用开销+文本解析)用于单字节访问。如果您确实需要,那么您可以在4字节的时间,而不是1(&1变为&4,并增加循环中的偏移量4)。读/写一个字节的NSIS文件指令速度更快,但仍然不是超快。让它超快速运行的唯一方法是为这个特定任务编写自己的插件。然后,您可以将文件映射到内存中,并通过原始内存访问直接更改其内容。谢谢!非常感谢。