以与平台无关的方式将行添加到文件中
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
另一答案
使用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
唯一的区别是在前置线之后没有第二条新线,这可能是可以纠正的,但功能上没有区别。
以上是关于以与平台无关的方式将行添加到文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?