如何读取当前正在评估的脚本的二进制部分?

时间:2018-04-21 09:08:59

标签: tcl

如何在源代码的Tcl脚本中读取流末尾(^Z)之后的部分?

到目前为止,我得到info script返回当前源脚本的文件名,我可以open就像任何文件一样,并通过解析文件将读取位置放在流结束之后。

理论上,文件的内容可能会在source和后续info script以及open的调用之间发生变化,从而可能导致读取脚本和二进制数据之间的时间不一致。

我错过了这个神奇的命令吗?或者我们是否依赖用户/管理员确保不会发生这种不一致?

1 个答案:

答案 0 :(得分:2)

建议

提供您的自定义source,它在与包含脚本的源代码相同的I / O步骤中提取预告片。例如:

interp hide {} source source
proc ::source {fp} {
  set size [file size $fp]
  set chan [open $fp r]
  info script $fp
  try {
    chan configure $chan -eofchar {\u001a {}}
    set script [read $chan]
    uplevel 1 [list eval $script]
    set scriptOffset [chan tell $chan]
    if {$scriptOffset < $size} {
      chan seek $chan 1 current; # move cursor beyond eof
      chan configure $chan -translation binary
      set trailer [read $chan]
      # do whatever you want to do with the trailer
    }
  } finally {
    close $chan
  }
}

一些评论

  • 诀窍是使用与Tcl&#39; source内部相同的机制:configure -eofchar
  • 一旦确定,有一个预告片(即超出eof char的内容),seek用于将光标定位在脚本的偏移处。
  • 第二个read将为您提供预告片。
  • 从这一点开始,您必须小心将拖车值保持为字节数组的形状。

免责声明:像Donal这样的Tcl巫师可能有更好的方法。此外,像starkits这样的单文件分发机制可能会有帮助来处理脚本预告片。