2017-05-03 6 views
5

エリクシル(またはErlang)では、メモリ内のファイルがある場合、その長さをバイト数でどのように見つけるか?Elixir/Erlangのメモリ内ファイルの長さを見つけますか?

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) 

答えて

2

わかりません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 
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

がより良い方法ですが、これは私がやったことであれば

{:ok, fd} = :file.open("", [:ram, :read, :write]) 
:file.write(fd, "hello") 
+0

ありがとう@ jason-tu!私の場合は、Erlang ':ram'ファイルを使用している既存のコードで作業する必要があります。 – jwfearn

関連する問題