<div><font face="UICTFontTextStyleBody"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);">All in one file:</span></font><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">-module(dir).</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">-include_lib("kernel/include/file.hrl").</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">-export([ walker/1,</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">         walker1/1,</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">         walker2/1 ]).</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">%% original</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker(Path) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   %% io:format("~s~n", [Path]),</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   case file:read_file_info(Path) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok, #file_info{type = regular}} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           1;</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       _ -> %% not care about symlink for nor, assume a directory</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           Children = filelib:wildcard(Path ++ "/*"),</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           lists:foldl(fun(P, N) -> N + walker(P) end, 0, Children)</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   end.</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">%% Sergej version + [raw] option</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker1(Path) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   case prim_file:list_dir(Path) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok,L} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           walker1(Path,L,0);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       _ -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           0</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   end.</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker1(Pth,["."|T],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   walker1(Pth,T,Sz);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker1(Pth,[".."|T],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   walker1(Pth,T,Sz);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker1(Pth,[H|T],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   Nm = Pth++"/"++H,</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   case prim_file:read_file_info(Nm, [raw]) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok,#file_info{type = regular, size = FS}} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           walker1(Pth,T,Sz+FS);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok,#file_info{type = directory}} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       case prim_file:list_dir(Nm) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">               {ok,L} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">                   walker1(Pth, T, walker1(Nm,L,Sz));</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">               _ -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">                   walker1(Pth, T, Sz)</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           end;</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       _ -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           walker1(Pth,T,Sz)</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   end;</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker1(_,[],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   Sz.</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">%% Sergej version + Max's hint</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker2(Path) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   {ok, Port} = prim_file:start(),</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   case prim_file:list_dir(Port, Path) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok,L} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           walker2(Port,Path,L,0);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       _ -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           0</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   end.</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker2(Port,Pth,["."|T],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   walker2(Port,Pth,T,Sz);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker2(Port,Pth,[".."|T],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   walker2(Port,Pth,T,Sz);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker2(Port,Pth,[H|T],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   Nm = Pth++"/"++H,</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   case prim_file:read_file_info(Nm, [raw]) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok,#file_info{type = regular, size = FS}} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           walker2(Port,Pth,T,Sz+FS);</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       {ok,#file_info{type = directory}} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           case prim_file:list_dir(Port,Nm) of</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">               {ok,L} -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">                   walker2(Port,Pth,T,walker2(Port,Nm,L,Sz));</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">               _ -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">                   walker2(Port,Pth, T, Sz)</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           end;</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">       _ -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">           walker2(Port,Pth,T,Sz)</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   end;</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">walker2(_,_,[],Sz) -></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">   Sz.</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">1> timer:tc(fun() -> dir:walker("/usr/share") end).</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">{<a href="tel:1538933,28941" dir="ltr">1538933,28941</a>}</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">2> timer:tc(fun() -> dir:walker1("/usr/share") end).</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">{<a href="tel:1492408,447632520" dir="ltr">1492408,447632520</a>}</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">3> timer:tc(fun() -> dir:walker2("/usr/share") end).</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">{<a href="tel:1477578,447632520" dir="ltr">1477578,447632520</a>}</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">Getting close to 1sec. Any other ideas for improvement?</span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody"></span><br style="font-family:UICTFontTextStyleBody"><span style="font-family:UICTFontTextStyleBody">/Frank</span></div><div><font face="UICTFontTextStyleBody"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);"><br></span></font><div class="gmail_quote"><div>Le sam. 10 déc. 2016 à 15:30, Mikael Pettersson <<a href="mailto:mikpelinux@gmail.com">mikpelinux@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Stanislaw Klekot writes:<br class="gmail_msg"><br> > On Fri, Dec 09, 2016 at 11:15:58PM +0000, Frank Muller wrote:<br class="gmail_msg"><br> > > I would like to improve the speed of my directory walker.<br class="gmail_msg"><br> > ><br class="gmail_msg"><br> > > walk(Dir) -><br class="gmail_msg"><br> > >     {ok, Files} = prim_file:list_dir(Dir),<br class="gmail_msg"><br> > >     walk(Dir, Files).<br class="gmail_msg"><br> ><br class="gmail_msg"><br> > Why prim_file:list_dir() instead of file:list_dir()? The former is<br class="gmail_msg"><br> > undocumented internal function.<br class="gmail_msg"><br><br class="gmail_msg"><br>list_dir can be a very time-consuming operation, and in those cases<br class="gmail_msg"><br>using file:list_dir would block the single file server for everything<br class="gmail_msg"><br>else.  We routinely use prim_file:list_dir to reduce the negative<br class="gmail_msg"><br>effects of accessing large directories.<br class="gmail_msg"><br></blockquote></div></div>