gpt4 book ai didi

go - 如何打印目录中文件的内容但忽略以写入模式打开的文件?

转载 作者:数据小太阳 更新时间:2023-10-29 03:21:07 26 4
gpt4 key购买 nike

我有一个 goroutine,它定期检查目录中的新文件,然后打印文件的内容。然而,还有另一个 goroutine 创建一个文件,将内容写入其中,然后保存文件。

如何忽略目录中以 WRITE 模式打开的文件?

示例代码:

for {
fileList, err := ioutil.ReadDir("/uploadFiles")
if err != nil {
log.Fatal(err)
continue
}

for _, f := range fileList {
log.Println("File : ", f.Name())
go printContents(f.Name())
}

time.Sleep(time.Second * 5)
}

在 printContents goroutine 中,我想忽略以 WRITE 模式打开的文件。

最佳答案

事情不是这样的。

我突然想到了这些选项:

  • 如果两个 goroutines 在同一个程序中工作,没有什么问题:让“生产者”goroutine 注册它已完成修改成一些文件的名称注册表,并使“消费者”goroutine 读取(和删除)来自该注册表。

    在最简单的情况下,可以是缓冲 channel 。

    如果生产者的工作速度比消费者快得多,而且你不想出于某种原因阻止前者那么受互斥锁保护的 slice 就符合要求。

  • 如果 goroutines 在同一个不同的进程中工作机器,但你控制两个程序,制作制作人进程将相同的数据传递给消费者进程通过任何合适类型的 IPC。

    用什么方法做 IPC 更好取决于进程启动、交互等。

    有多种选择。

  • 如果您控制两个进程但又不想打扰他们之间的IPC(也有原因),然后制作生产者遵循有关如何编写文件的最佳实践(稍后会详细介绍),并让消费者使用任何文件系统监控工具,用于报告生产者生成(“出现”)哪些文件。您可以从 github.com/fsnotify/fsnotify 开始.

    要正确写入文件,生产者必须写入其数据到一个临时文件——也就是说,一个文件位于同一个目录,但有一个很好理解的文件名表示文件尚未完成——例如,“.foobar.data.part”或“foobar.data.276gd14054.tmp”可以写入“foobar.data”。(存在其他方法,但这种方法足以开始。)

    文件准备好后,制作人必须重命名文件从它的临时名称到它的“正确的”最终名称。此操作在所有合理的操作系统/文件系统上都是原子的,并使文件从 PoV 原子地“进入存在状态”消费者的。例如,inotify on Linux generatesan event of type "moved to" for such an appearance .

    如果您不想自己做正确的事情,github.com/dchest/safefile是一个很好的跨平台开始。

    如您所见,通过这种方法您知道该文件仅根据报告的事实完成出现了。

  • 如果您无法控制生产者,您可能需要求助于猜测。

    最简单的方法还是再次监控文件系统事件——但这次是“文件更新”事件,而不是“文件创建”事件。对于报告为已更新的每个文件,您必须记住该事件的时间戳,当经过一定时间后,您可以声明该文件是由制作者完成的。

    IMO 这种方法是最糟糕的,但是如果你没有更好的选择,它至少是一些东西。

关于go - 如何打印目录中文件的内容但忽略以写入模式打开的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53728896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com