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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以与平台无关的方式将行添加到文件中相关的知识,希望对你有一定的参考价值。

在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]';
"
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)的一个结果中,提到需要在大文件前面添加一行,在这种情况下,我可能会担心打开/关闭文件两次。还有其他方法可行吗?

答案

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

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

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

或这个

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

文档:fileutil (package)

另一答案

使用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
另一答案

我发现我可以通过在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]';
"
seek $_fileR 0
puts $_fileR $preamble

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

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

以上是关于以与平台无关的方式将行添加到文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

以与数据库无关的方式构建查询

layui当点击增加的时候,将form中的值获取的添加到table行中代码

JavaScript中代码注释的正确方式是啥

loback.xml 在idea中代码自动完成

深入理解Java虚拟机 理解平台无关性