读取刚刚写入临时文件的数据[重复]

2023-11-30

在 Go 中,我尝试将数据写入临时文件,然后转身读取该文件,但没有成功。下面是一个精简的测试程序。我已通过检查临时文件验证数据是否已写入文件。所以,至少我知道数据正在进入文件。我只是无法读出它。

提前谢谢你的帮助

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {

    tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0])))
    if err != nil {
        log.Fatal("Could not create temporary file", err)
    }
    fmt.Println("Created temp file: ", tmpFile.Name())
    //  defer os.Remove(tmpFile.Name())

    fmt.Println("Writing some data to the temp file")
    if _, err = tmpFile.WriteString("test data"); err != nil {
        log.Fatal("Unable to write to temporary file", err)
    } else {
        fmt.Println("data should have been written")
    }

    fmt.Println("Trying to read the temp file now")
    s := bufio.NewScanner(tmpFile)
    for s.Scan() {
        fmt.Println(s.Text())
    }
    err = s.Err()
    if err != nil {
        log.Fatal("error reading temp file", err)
    }
}

ioutil.TempFile创建一个临时文件并打开该文件进行读写并返回结果*os.File(文件描述符)。因此,当您在文件内写入时,指针将移动到该偏移量,即当前位于文件末尾。 但是当您的要求是从文件中读取时,您需要Seek回到开头或任何需要的偏移量使用*os.File.Seek方法。所以,添加tmpFile.Seek(0, 0)会给你想要的行为。

另外,作为一个好的做法,不要忘记关闭文件。注意我用过defer tmpFile.Close()它在退出之前关闭文件。

请参考以下示例:

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0])))
    if err != nil {
        log.Fatal("Could not create temporary file", err)
    }
    defer tmpFile.Close()

    fmt.Println("Created temp file: ", tmpFile.Name())

    fmt.Println("Writing some data to the temp file")
    if _, err = tmpFile.WriteString("test data"); err != nil {
        log.Fatal("Unable to write to temporary file", err)
    } else {
        fmt.Println("Data should have been written")
    }

    fmt.Println("Trying to read the temp file now")

    // Seek the pointer to the beginning
    tmpFile.Seek(0, 0)
    s := bufio.NewScanner(tmpFile)
    for s.Scan() {
        fmt.Println(s.Text())
    }
    if err = s.Err(); err != nil {
        log.Fatal("error reading temp file", err)
    }
}

更新: 来自OP的评论:

鉴于删除实际文件也被推迟,是否需要推迟关闭?如果是这样,我想推迟的顺序很重要。

所以,这是一个很好的问题。因此基本的经验法则是关闭文件然后删除。因此,甚至可以先删除然后再关闭它,但这取决于操作系统。

如果您参考C++ 的文档:

如果文件当前由当前进程或另一个进程打开,则此函数的行为是实现定义的(特别是,POSIX 系统取消链接文件名,尽管文件系统空间不会被回收,即使这是到该文件的最后一个硬链接)文件直到最后一个运行的进程关闭该文件为止,Windows不允许删除该文件)

因此,在 Windows 上,如果您尝试先删除它而不关闭它,那么这肯定是一个问题。

So, as defer是堆叠的,所以执行顺序是

defer os.Remove(tmpFile.Name()) // Called 2nd
defer tmpFile.Close() // Called 1st
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取刚刚写入临时文件的数据[重复] 的相关文章

随机推荐

  • 确定数据表中的重复项

    我有一个从 CSV 文件加载的数据表 我需要根据两列确定哪些行是重复的 product id and owner org id 在数据表中 一旦确定了这一点 我就可以使用该信息来构建结果 该结果是一个仅包含不唯一行的数据表 以及一个仅包含唯
  • 只需按一下按键即可连续移动?

    我正在尝试用java编写一个程序 该程序涉及通过按一次按键使对象不断移动 想想 Pacman 你按下一次 Pacman 就会继续上升 直到你按下另一个键 如果可能的话 我想让代码保持简单 我原来的动作 一次按键 一次动作 是这样的 publ
  • 将类变量传递给另一个类

    我想将一个类变量传递给另一个类 并使其成为该类的类变量 在以下情况下我将如何执行此操作 public class GLCamTest extends Activity public float array something class G
  • Jena Fuseki Sparql 无查询=错误

    我正在尝试使用这个简单的查询将数据插入 jena fusioni 图中 PREFIX test
  • Android 语音通话记录

    我希望有一些代码能够收到任何传入和传出语音呼叫的通知 我需要获取以下所有内容 如果是来电或去电 拨打的号码或来电显示的电话号码 通话时长 或者是否是未接来电 如果我可以获得更多联系信息 特别是联系人姓名 如果电话号码与手机联系人列表中的某个
  • 具有不同本地名称的 XDocument 重复命名空间

    我有一个 XML 文档 如下所示
  • 仅在 iOS 17 设备以下遇到错误“线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)”

    我刚刚将 XCode 更新到版本 15 遇到此错误 仅限 17 以下的 iOS 版本 Thread 1 EXC BAD ACCESS code 1 address 0x0 显示此错误的代码 PathMonitorConectivityPro
  • 如果日志包含特定单词,则忽略并移至下一个模式

    我有一个来自 spring 日志文件的日志文件 日志文件具有三种格式 前两种格式各占一行 中间如果有关键字app info 则为自己开发者打印的信息 如果没有 则由spring框架打印 我们可能会以不同于 Spring 框架的方式对待开发者
  • 自动检测新添加的源文件

    我的问题是 每次添加新的源文件时 我都被迫重新运行 CMake 这真的很烦人 有什么方法 CMake 可以自动检测新添加的源文件吗 CMake 没有观察文件夹的功能 某些操作系统 例如 MacOS X 可以在文件夹发生更改时执行操作 如果任
  • 如何使 C# Xamarin.Android 应用程序在手机启动时运行?

    我一直在尝试让应用程序在手机启动时运行 并最终在按下时运行应用程序KeyCode CameraButton 我正在使用一个名为BootReceiver 继承自BroadcastReceiver 这是我的课程 namespace ColorP
  • 我的 APK 的 META-INF 中的 androidx.XXXX.version 文件是什么?

    当使用 AndroidX 库构建 APK 时 我会得到很多小文本文件 例如META INF androidx core core version 这些文件的目的是什么 它们是如何使用的androidx 我最近也很好奇 所以浏览了一下源代码
  • 如何将 VSIX 输出包含在其包中?

    我创建了一个 VSIX 包 我想将它的输出 dll 包含在 VSIX 中 我尝试在资产部分的 vsixmanifest 文件中添加 MEF 组件引用 但它没有解决 任何想法 用记事本打开项目文件并将此项设置为 true
  • CSS 显示不起作用

    我真的很沮丧因为Display none没有在处理 tr IE 7 中的元素 我该怎么办 它在 FF Chrome 等上完美运行 首先使用以下工具检查您的代码是否正确 HTML 验证器 CSS 验证器 tr
  • 使用 json lib 使用 Python 从嵌套 JSON 中获取元素

    我想列出 BoxDet 中名称为 BoxDet 的所有元素 目的是以这种方式列出它 BoxDet ABC 我的 JSON 的一小部分 id 1 name BoxH readOnly true children id 100 name Box
  • 从 Hoxton.SR4 升级到 Spring Cloud Hoxton.SR7 后遇到错误

    使用 Spring CloudHoxton SR4和 Spring Boot2 2 9 RELEASE库 我的 Spring Boot 微服务可以正确启动 并且在本地环境中针对 localstack 运行时运行得很好 但是当我升级到Hoxt
  • 如何通过 LINQ to XML 创建字典

    我有以下 XML
  • PhoneGap 未发出 AJAX (jsonp) 请求

    我一整天都在努力解决这个问题 并用谷歌搜索了所有地方 可能我只是找不到包含解决方案的一页 但我已经查看了问题和解决方案 例如 Ajax 调用phonegap 不发送请求 JQuery mobile Phonegap Ajax 调用无法在 A
  • 将具有相同 ID 类和标签 HTML 的多个元素拖放到屏幕上的任意位置

    大家好 这是我的第一个问题 所以我可能做错了 我想要实现的是拥有多个
  • 实现 PostgreSQL 表的历史记录

    我想实现 PostgreSQL 表的更改历史记录 该表的定义方式如下 CREATE TABLE ps counters psid integer NOT NULL counter bigint NOT NULL 我希望历史表看起来像 CRE
  • 读取刚刚写入临时文件的数据[重复]

    这个问题在这里已经有答案了 在 Go 中 我尝试将数据写入临时文件 然后转身读取该文件 但没有成功 下面是一个精简的测试程序 我已通过检查临时文件验证数据是否已写入文件 所以 至少我知道数据正在进入文件 我只是无法读出它 提前谢谢你的帮助