erlang对我来说是一种奇怪的语言,本周我一直在玩多种语言,我经常来这里寻求帮助,现在我正在使用erlang而且我再次陷入困境:)
基本上我所要做的就是以下但是在erlang中:
Dim objFSO, objFile, objFolder
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(currentDirectory))
For Each objFile in objFolder.Files
do something with the file
do something else
do more stuff
Next
Run Code Online (Sandbox Code Playgroud)
我最接近的是:
-export([main/1]).
main([]) ->
find:files("c:\","*.txt", fun(F) -> {
File, c:c(File)
}end).
Run Code Online (Sandbox Code Playgroud)
显然,没有工作,没有像我需要的那样......但我已经尝试了很多方法并阅读了许多例子,但是根本无法找到一个解决方案,也许这种语言的语言不是很好吗?
这需要作为escript(erlang脚本)
cho*_*ops 10
很难确切地推荐你应该使用哪种方法,因为你的"做某事"伪代码太模糊了.
在Erlang这样的函数式语言中,有两种主要的方法可以迭代一些东西:map
和fold
.
最大的问题归结为:你想对这些文件做什么?你想总的东西了的文件(即,文件总大小什么的),或者你想保存每个文件的一些值(即每个单独的文件大小),或做你想要做的事来的文件和你不关心这些文件的返回值是什么(即重命名每个文件)?
我将使用从file:list_dir/1
以下位置返回的文件列表快速给出每个示例:
{ok, Filenames} = file:list_dir("some_directory"),
Run Code Online (Sandbox Code Playgroud)
折页
在这里,我们将使用目录中的所有文件的文件大小lists:foldl
(如@legoscia所提到的,在这种情况下,filelib:fold_files
可能是更好的选择)
TotalSize = lists:foldl(fun(Filename,SizeAcc) ->
FileInfo = file:read_file_info("some_directory/" ++ Filename),
FileSize = FileInfo#file_info.size,
SizeAcc + FileSize
end, 0, Filenames).
Run Code Online (Sandbox Code Playgroud)
制图
在这里,我们将获得一个文件名列表以及每个文件的文件大小lists:map
.结果列表的格式为[{"somefile.txt",452}, {"anotherfile.exe",564},...]
:
FileSizes = lists:map(fun(Filename) ->
FileInfo = file:read_file_info("some_directory/" ++ Filename),
FileSize = FileInfo#file_info.size,
{Filename,FileSize}
end,Filenames).
Run Code Online (Sandbox Code Playgroud)
Foreach(映射的变体)
只是重命名文件但不关心记录有关文件的任何数据的替代方法是演示使用lists:foreach
,这通常专门用于副作用编程,你不关心返回值,它的工作原理如下lists:map
:但是没有返回任何有用的东西(它只返回原子ok
):
在这种情况下,我将通过为每个文件名添加".old"扩展名来重命名每个文件:
lists:foreach(fun(Filename) ->
OldFile = "some_directory/" ++ Filename,
NewFile = OldFile ++ ".old",
file:rename(OldFile, NewFile),
end,Filenames).
Run Code Online (Sandbox Code Playgroud)
递归
当然,原始版本的所有这些的-如果map
,fold
,foreach
,或列表解析(我没有涉及,但基本上都是另一种变体map
与filter
组件)的限制也不管是什么原因-你可以做的事情递归:
do_something_with_files([]) -> ok;
do_something_with_files([CurrentFile|RestOfFiles]) ->
do_something(CurrentFile),
do_something_with_files(RestOfFiles).
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到你需要使用Erlang什么,但不像像VB程序语言,你一定觉得有点超前,以什么你想跟踪或者为了做决定如何你想遍历您的名单,因为你受到Erlang中不可变变量的限制.
注意:要使用该#file_info
记录,您需要在模块顶部包含file.hrl文件:
-include_lib("kernel/include/file.hrl").
Run Code Online (Sandbox Code Playgroud)