2017-05-03 1 views
5

메모리 내 파일이있는 경우 Elixir (또는 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를 사용하는 경우을 사용할 수도 있습니다.문자열을 IO 장치로 처리하는 모듈.

# 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에 따라서 대상이 문서화되어 언제든지/제거를 변경 (. 그것은 기본적으로 RAM 파일입니다) 다음은 예입니다. – jwfearn

1

이 더 좋은 방법이지만, 이것이 내가 무슨 짓을했는지 경우

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

감사합니다. @ jason-tu! 제 경우에는 Erlang': ram' 파일을 사용하는 기존 코드로 작업해야합니다. – jwfearn

관련 문제