以与平台无关的方式将行添加到文件中

问题描述 投票:1回答:3

在Tcl应用程序中,我需要在现有的.js文件中添加一行Javascript代码。我用Google搜索“tcl prepend line to file”并没有找到任何特别有用的例子,特别是因为我需要这个与平台无关。

我发现一种方法是首先打开文件进行读取,然后以下列方式进行写入:

set fileName [file join $appContentDir deleteBinDir.js]
set _fileR [open $fileName r]
set fileContent [read $_fileR]
close $_fileR

set _fileW [open $fileName w]
puts $_fileW "var path = '[file join $appNwDir bin]';\n"
puts $_fileW $fileContent
close $_fileW

生成的Javascript代码为:

var path = 'C:/opt/dev/dexygen/poc/2eggz/rename_2eggz.vfs/../nw/bin'; //prepended line

var gui = require('nw.gui');
var fs = require('fs');
var p = require("path");

gui.Window.get().on('close', deleteDirectoryContents);

function deleteDirectoryContents() {
    //etc

然而,在google搜索(http://www.tek-tips.com/viewthread.cfm?qid=1691902)的一个结果中,提到需要在大文件前面添加一行,在这种情况下,我可能会担心打开/关闭文件两次。还有其他方法可行吗?

file-io tcl
3个回答
1
投票

你可以通过这样做来削减一些角落:

set fileName [file join $appContentDir deleteBinDir.js]
set _fileR [open $fileName r+]
set fileContent [read $_fileR]

set preamble "var path = '[file join $appNwDir bin]';\n"
seek $_fileR 0
puts $_fileR $preamble\n$fileContent
close $_fileR

或这个

package require fileutil
set fileName [file join $appContentDir deleteBinDir.js]
set preamble "var path = '[file join $appNwDir bin]';\n"
::fileutil::insertIntoFile $fileName 0 $preamble\n 

文档:fileutil (package)


2
投票

使用fcopy可能会更快:

file rename file file.orig
set fin [open file.orig r]
set fout [open file w]

puts $fout "first line"
fcopy $fin $fout

close $fin
close $fout
file delete file.orig

0
投票

我发现我可以通过在r+模式下打开文件并使用搜索来完​​成此操作。前三行代码基本相同,但后来我将行存储在变量前面。这允许我a)将行写入文件中的第一个位置,b)将原始文件内容写入文件中等于前置行长度的位置

set fileName [file join $appContentDir deleteBinDir.js]
set _fileR [open $fileName r+]
set fileContent [read $_fileR]

set preamble "var path = '[file join $appNwDir bin]';\n"
seek $_fileR 0
puts $_fileR $preamble

seek $_fileR [string length $preamble]
puts $_fileR $fileContent
close $_fileR

唯一的区别是在前置线之后没有第二条新线,这可能是可以纠正的,但功能上没有区别。

© www.soinside.com 2019 - 2024. All rights reserved.