/carrier/client/test.erl

http://egfs.googlecode.com/ · Erlang · 130 lines · 94 code · 14 blank · 22 comment · 0 complexity · 3d8d75144a55f7a0d536c7652fed36e7 MD5 · raw file

  1. %%%-------------------------------------------------------------------
  2. %%% File : client.erl
  3. %%% Author : XCC & HXM
  4. %%% Description : the client template:offer open/write/read/del function
  5. %%%
  6. %%% Created :
  7. %%%-------------------------------------------------------------------
  8. -module(test).
  9. -include("../include/egfs.hrl").
  10. -include_lib("kernel/include/file.hrl").
  11. -include("filedevice.hrl").
  12. -import(clientlib,[get_file_name/1, get_file_size/1,
  13. get_file_handle/2, delete_file/1]).
  14. -compile(export_all).
  15. -define(BINARYSIZE, 67108864).%67108864 %8388608
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %% write function for write
  18. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  19. write(FileName, RemoteFile) ->
  20. ?DEBUG("[client, ~p]:test write begin at ~p~n~n", [?LINE, erlang:time()]),
  21. {ok, FileLength} = file_size(FileName),
  22. {ok, FileDevice} = client:open(RemoteFile, w), %%only send open message to metaserver
  23. {ok, Hdl} = own_file_handle(read, FileName),
  24. loop_write(Hdl, FileDevice, 0, FileLength),
  25. ?DEBUG("~n[client, ~p]:test write end at ~p~n", [?LINE, erlang:time()]),
  26. file:close(Hdl),
  27. client:close(FileDevice).
  28. loop_write(Hdl, FileDevice, Start, Length) when Length > 0 ->
  29. {ok, Binary} = read_tmp(Hdl, Start, ?BINARYSIZE),
  30. {ok, FileDevice1} = client:pwrite(FileDevice, Start ,Binary),
  31. Start1 = Start + ?BINARYSIZE,
  32. Length1 = Length - ?BINARYSIZE,
  33. loop_write(Hdl, FileDevice1, Start1, Length1);
  34. loop_write(_, _, _, _) ->
  35. ?DEBUG("[Client, ~p]:write file ok~n", [?LINE]).
  36. read_tmp(Hdl, Location, Size) ->
  37. file:pread(Hdl, Location, Size).
  38. file_size(FileName) ->
  39. case file:read_file_info(FileName) of
  40. {ok, Facts} ->
  41. {ok, Facts#file_info.size};
  42. _ ->
  43. error
  44. end.
  45. own_file_handle(write, FileName) ->
  46. file:open(FileName, [raw, append, binary]);
  47. own_file_handle(read, FileName) ->
  48. file:open(FileName, [raw, read, binary]).
  49. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  50. %% read function for write
  51. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  52. read(FileName, LocalFile, Start, Length) ->
  53. ?DEBUG("[client, ~p]:test read begin at ~p~n~n", [?LINE, erlang:time()]),
  54. {ok, FileDevice} = client:open(FileName, r),
  55. client:pread(FileDevice, Start, Length),
  56. client:close(FileDevice),
  57. FileID = FileDevice#filedevice.fileid,
  58. {ok, Hdl} = get_file_handle(read, FileID),
  59. {ok, FileSize} = get_file_size(FileID),
  60. {ok, DstHdl} = own_file_handle(write, LocalFile),
  61. loop_read_tmp(Hdl, DstHdl, 0, FileSize),
  62. file:close(DstHdl),
  63. delete_file(FileID),
  64. ?DEBUG("~n[client, ~p]:test read end at ~p~n", [?LINE, erlang:time()]).
  65. loop_read_tmp(Hdl, DstHdl, Start, Length) when Length > 0 ->
  66. if
  67. Length - ?BINARYSIZE > 0 ->
  68. Size = ?BINARYSIZE;
  69. true ->
  70. Size = Length
  71. end,
  72. {ok, Binary} = read_tmp(Hdl, Start, Size),
  73. Length1 = Length - Size,
  74. Start1 = Start + Size,
  75. file:write(DstHdl, Binary),
  76. loop_read_tmp(Hdl, DstHdl, Start1, Length1);
  77. loop_read_tmp(_, _, _, _) ->
  78. void.
  79. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  80. %% read file from 0 to end
  81. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  82. read(FileName, LocalFile) ->
  83. ?DEBUG("[client, ~p]:test read begin at ~p~n~n", [?LINE, erlang:time()]),
  84. {ok, FileDevice} = client:open(FileName, r),
  85. {ok, FileInfo} = client:read_file_info(FileName),
  86. {Length, _, _, _, _} = FileInfo,
  87. ?DEBUG("[client, ~p]:Length from read_file_info:~p~n~n", [?LINE, Length]),
  88. client:pread(FileDevice, 0, Length),
  89. client:close(FileDevice),
  90. FileID = FileDevice#filedevice.fileid,
  91. {ok, Hdl} = get_file_handle(read, FileID),
  92. {ok, FileSize} = get_file_size(FileID),
  93. {ok, DstHdl} = own_file_handle(write, LocalFile),
  94. loop_read_tmp(Hdl, DstHdl, 0, FileSize),
  95. file:close(DstHdl),
  96. delete_file(FileID),
  97. ?DEBUG("~n[client, ~p]:test read end at ~p~n", [?LINE, erlang:time()]).
  98. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  99. %% delete function for write
  100. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  101. del(FileName) ->
  102. client:delete(FileName),
  103. ?DEBUG("~n[client, ~p]:test read end at ~p~n", [?LINE, erlang:time()]).
  104. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  105. %% read infomation of file
  106. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  107. read_info(FileName) ->
  108. {ok, FileInfo} = client:read_file_info(FileName),
  109. ?DEBUG("[client, ~p]:~n", [?LINE]),
  110. {FileSize, Chunklist, CreatT, ModifyT, Acl} = FileInfo,
  111. ?DEBUG("[client, ~p]:~n", [?LINE]),
  112. ?DEBUG("[client, ~p]:file size: ~p~n", [?LINE, FileSize]),
  113. ?DEBUG("[client, ~p]:chunk list: ~p~n", [?LINE, Chunklist]),
  114. ?DEBUG("[client, ~p]:creat time: ~p~n", [?LINE, binary_to_term(CreatT)]),
  115. ?DEBUG("[client, ~p]:modifytime: ~p~n", [?LINE, binary_to_term(ModifyT)]),
  116. ?DEBUG("[client, ~p]:acl: ~p~n", [?LINE, Acl]).