2017-05-03 40 views

回答

2

不知道是否有更好的方法,但是这是我做过什么:

def get_length(fd) do 
    {:ok, cur} = :file.position(fd, {:cur, 0}) 
    try do 
    :file.position(fd, {:eof, 0}) 
    after 
    :file.position(fd, cur) 
    end 
end 

用法:

{:ok, fd} = :file.open("", [:ram, :read, :write]) 
:ok = :file.write(fd, "hello") 
{:ok, len} = get_length(fd) 
3

您可以使用:ram_file.get_size/1

iex(1)> {:ok, fd} = :file.open("", [:ram, :read, :write]) 
{:ok, {:file_descriptor, :ram_file, #Port<0.1163>}} 
iex(2)> :file.write(fd, "hello") 
:ok 
iex(3)> :ram_file.get_size(fd) 
{:ok, 5} 
iex(4)> :file.write(fd, ", world!") 
:ok 
iex(5)> :ram_file.get_size(fd) 
{:ok, 13} 
+1

这是非常干净的,但要注意的是,':ram_file'模块正式在无证OTP也因此受到随时更改/删除。 – jwfearn

1

如果您使用的是Elixir,您也可以使用StringIO模块将字符串视为IO设备。 (这基本上是一个RAM文件)下面是一个例子:

# create ram file 
{:ok, pid} = StringIO.open("") 

# write to ram file 
IO.write(pid, "foo") 
IO.write(pid, "bar") 

# read ram file contents 
{_, str} = StringIO.contents(pid) 

# calculate length 
str |> byte_size  |> IO.inspect # number of bytes 
str |> String.length |> IO.inspect # number of Unicode graphemes 
+0

谢谢@ jason-tu!就我而言,我必须使用使用Erlang':ram'文件的现有代码。 – jwfearn