如何在Nim中异步读取文件?

时间:2018-11-02 01:55:11

标签: nim

我一直在关注《行动中的尼姆》。

在第3章中,有一个像这样的例子:

import asyncdispatch, asyncfile

proc readFiles() {.async.} =
    var file = openAsync("/tmp/hello.py", fmReadWrite)
    let data = await file.readAll()
    echo(data)
    await file.write("Hello!\n")
    file.close()

waitFor readFiles()

我对示例所做的唯一更改是将文件名替换为系统上存在的文件名。

该代码应该输出打开的文件的内容并向其中写入“ Hello!\ n”。

但是,当我运行它时,readAll总是返回一个空字符串,我通过添加assert len(data) > 0进行了验证。

如何更改才能成功进行异步读取?

编辑

我的nim编译器的版本是:

$ nim --version
Nim Compiler Version 0.19.0 [MacOSX: amd64]
Compiled at 2018-09-28
Copyright (c) 2006-2018 by Andreas Rumpf

active boot switches: -d:release -d:useLinenoise

1 个答案:

答案 0 :(得分:1)

所以。问题是您假设echo(data)应该打印某些内容。即使您将数据放入该文件中,它也永远不会打印任何内容,因为根据documentation中的fmReadWrite选项:

  

如果文件不存在,将创建它。现有文件将被清除!

即使没有异步,也要遍历这段代码:

  1. 打开文件(文件为空b / c fmReadWrite)
  2. 读取文件
  3. 打印您读取的数据
  4. 向文件打个招呼\ n
  5. 关闭文件

有道理吗?

以下代码直接取自documentation ...

import asyncfile, asyncdispatch, os

proc main() {.async.} =
  var file = openAsync(getTempDir() / "foobar.txt", fmReadWrite)
  await file.write("test")
  file.setFilePos(0)
  let data = await file.readAll()
  doAssert data == "test"
  file.close()

waitFor main()

...正是您想要的。它与本书教程几乎完全相同。请注意,file.setFilePos(0)调用会在写入数据后将文件指针重置为开头。

还应该注意的是,在阅读了您所指的书中的这一部分之后,作者并没有说这应该打印出任何内容。他们只是说

  

显示文件的内容。

我同意,这有点误导。我相信本教程的重点是向您展示执行异步I / O有多么容易。即使教程中提供了示例代码,它也不会打印任何内容,但会留下一个包含hello\n的文件。

也许更好的示例是在运行代码之前创建要读取的文件,然后将标志更改为fmReadWriteExisting,这样,您将可以打印一些内容。