【问题标题】:Deleting contents of a file in Tcl在 Tcl 中删除文件的内容
【发布时间】:2012-09-10 22:34:07
【问题描述】:

我在删除文本文件的内容时遇到了一些问题。据我所知,由于我们使用的 PLM 软件存在权限问题,我似乎无法重命名或删除此文件并创建一个具有相同名称的新文件。不幸的是,我一个人在这里,因为似乎没有人知道到底出了什么问题。

不过,我可以读写这个文件。所以我一直在查看seek 命令并执行以下操作:

set f [open "C:/John/myFile.txt" "a+"]

seek $f 0   
set fp [tell $f]

seek $f 0 end
set end [tell $f]

# Restore current file pointer
seek $f $fp

while { $fp < $end } {
    puts -nonewline $f " "
    incr fp
}

close $f

这似乎用空格替换了所有行,但我不确定这是处理这个问题的正确方法。有人可以给我一些指示吗?我对 Tcl 还是比较陌生。

谢谢!

【问题讨论】:

    标签: file file-io permissions tcl


    【解决方案1】:

    如果您至少有 Tcl 8.5,请在 r+w+ 模式下打开文件(可能需要进行实验),然后使用 chan truncate

    chan truncate $f 0
    

    如果您使用的是 8.4 或更早版本,则必须这样做(它仅适用于截断为空):

    close [open $thefilename "w"]
    

    w 模式会在文件不存在时创建文件,如果存在则在打开时将其截断为空。程序的其余部分可能会也可能不会这样!)

    但是请注意,这不会重置文件上打开的其他通道认为它们所在的位置。即使没有锁定,这也可能导致奇怪的效果(例如以大偏移量写入,操作系统用零填充前面的字节)。

    【讨论】:

    • 另外,在执行此类操作时,请避免使用aa+ 模式;它们有一些与它们相关的特殊语义,它们与截断不能很好地混合。 (尤其是在 Windows 上,它在这方面非常非 POSIX。)
    【解决方案2】:
    close [open $path w]
    

    瞧,一个空文件。如果此文件尚不存在,则会创建它。

    【讨论】:

      【解决方案3】:

      一个非常简单的方法是用一个空文件覆盖你的文件。例如创建一个空文件(您可以手动或使用以下 TCL 代码):

      set blank_file [open "C:/tmp/blank.txt" "w"]
      close $blank_file
      

      然后用空白文件覆盖原始文件,如下所示:

      file rename -force "C:/tmp/blank.txt" "C:/John/myFile.txt"
      

      当然,如果其他东西抓取了文件,您可能会遇到权限问题。

      【讨论】:

        【解决方案4】:

        你说文件是用另一个进程独占打开的,但你可以写入它?!我认为你有权限问题。您使用的是 Linux 还是 Unix?! (貌似是windows系统但是linux/unix系统一般都会出现权限问题,很奇怪吧?!)

        如果您能够读取和写入文件,则该文件不是以独占方式打开的,并且您可能没有适当的权限来删除该文件。

        此外,最好在您知道自己拥有所有权限的文件上测试代码。如果代码正常工作,您可以专注于您的目标文件。你也可以谷歌“如何在 Tcl 中归档操作”。阅读此Manipulating Files With Tcl

        【讨论】:

        • 好的,我现在明白我的措辞不清楚。该文件由另一个进程打开,但读取和写入该文件的 Tcl 脚本也在同一个进程中。只是我只能读写,不能重命名或删除。整个“权限被拒绝”是我尝试在此过程中重命名或删除文件时收到的错误消息。
        • 所以如果你在同一个进程中专门打开了文件,应该没有问题。你只需要知道如何在 Tcl 中操作文件。
        • 您要删除还是重命名文件?!或者你想读写文件?!文件保持打开状态,因为为文件分配了处理程序并且您的应用程序正在保留它。当应用程序释放处理程序时,文件将被释放和关闭。
        • 我想删除文件的内容。我尝试的第一个选项是简单地删除该文件并创建另一个具有相同名称的文件,尽管事实上我拥有管理员权限,但我在使用的 PLM 软件中遇到了权限问题。所以我接下来尝试的是覆盖每一行的内容。
        • 所以你可以寻找 0 并转到文件的第一个。并且写入数据没有任何问题。您将写入以前的数据。还要保留一个计数器并在应用程序关闭时删除该计数器之后剩余的内容以使文件正确。
        猜你喜欢
        • 2015-03-30
        • 2013-11-04
        • 2018-12-10
        • 2012-06-20
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        相关资源
        最近更新 更多