以字符串形式读取整个文件内容

时间:2017-03-22 22:54:17

标签: genie

如何在Genie中将整个文件内容读入字符串变量?

(我在文档中找不到任何内容。文档似乎也分散且不完整。)

1 个答案:

答案 0 :(得分:4)

Genie语言本身没有内置文件输入/输出。您将需要使用库,这也是文档在很多地方的部分原因。有很多选择!

作为一般规则,像这样的低级功能的良好起点是GLib library。 Genie大量使用GLib作为其类型系统,并默认包含GLib库的绑定。以下是使用GLib's FileUtils的示例:

[indent=4]
init
    var filename = "test.txt"
    file_loaded:bool = false
    contents_of_file:string
    try
         file_loaded = FileUtils.get_contents( filename, out contents_of_file )
    except error:FileError
        print( error.message )
    if file_loaded
         print( @"Contents of $filename:

$contents_of_file")

编译:

valac fileutils_example.gs

这个例子使用了Genie's:

  • 使用var keywod
  • 进行类型推断
  • out参数contents_of_file
  • 通过在contents_of_file
  • 之外声明try...except来确定范围规则
  • 字符串模板,用于调用变量' s @""方法的to_string()语法

GLib库包含一个额外的组件GIO,它提供异步输入/输出和基于流的API。下一个示例是一个非常基本的示例,与上面相同,但使用GIO接口:

[indent=4]
init
    var file = File.new_for_path( "test.txt" )
    file_loaded:bool = false
    contents_of_file:array of uint8
    try
        file_loaded = file.load_contents( null, out contents_of_file, null )
    except error:Error
        print( error.message )
    if file_loaded
        text:string = (string)contents_of_file
        print( @"Contents of $(file.get_basename()):

$text")

编译:

valac --pkg gio-2.0 -X -w fileinputstream_example.gs

需要注意的是:

  • --pkg gio-2.0使用GIO库,前面的示例中不需要--pkg glib-2.0,因为默认情况下已完成
  • contents_of_file:array of uint8out
  • 的缓冲区和load_contents ()参数
  • -X -w的{​​{1}}选项会阻止来自C编译器的警告valac正在预期guint8
  • 缓冲区需要强制转换为字符串:char
  • 如果您使用(string)contents_of_file或派生循环,您可以让GIO在后台线程中加载文件:GLib.Mainloop
  • 如果你到了写一个绑定到库的点,那么file_loaded = yield file.load_contents_async( null, out contents_of_file, null )参数可以被赋予默认值null,所以它们变成可选的,但是这个技术没有在GIO中使用绑定

最后,可能还有其他库可以更好地满足您的需求。例如,Posix.FILE是另一种读取和写入文件的方式。