【问题标题】:Iterate through filenames and remove extensions in Erlang遍历文件名并删除 Erlang 中的扩展名
【发布时间】:2019-05-16 20:40:01
【问题描述】:

我是 Erlang 新手。我已经尝试对此进行研究,但由于我是这种语言的新手并且对我的代码感到困惑,所以我在这里发布。

我想遍历目录中的文件,并为每个文件运行基于文件名(减去其扩展名)的命令。

例如,这个(未经测试的)批处理文件应该遍历一个 XML 文件的文件夹,将当前文件名存储在一个变量中(减去文件扩展名),然后下载一个同名的 JPEG:

for %%a in (*.xml) do (

   set "current_filename=%%~na"

   wget -q -c -t 2 -0 "C:\Photos" "https://www.example.com/!current_filename!.jpg"

)

这是我当前的 Erlang 模块代码:

-module(erlangtest1).

-include_lib("kernel/include/file.hrl").

-compile(export_all).

ListXmlFiles() -> lists:foldl(fun(Filename) ->
        FileInfo = file:read_file_info("C:/XML/" ++ Filename),
    end, 0, Filenames).

到目前为止,我一直在编写一个函数来检索文件名。完成此操作后,我将尝试通过 os:cmd/1 运行 wget。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    使用filelib:wildcard函数:

    Filenames = filelib:wildcard("*.xml", "C:/XML")
    

    【讨论】:

    • 我试图让它在我的模块中工作,但我收到这个错误:“之前的语法错误:文件名”你能告诉我你在我的脚本上下文中的意思吗让我明白吗?谢谢!
    • 我找到了解决方案,将命令包装在一个函数中,如下所示:gather_filenames() -> Filenames = filelib:wildcard("*.xml", "C:/XML"), Filenames .
    • @grgoelyk 您的函数中不需要该变量。这样做:gather_filenames() -> filelib:wildcard("*.xml", "C:/XML")。
    • 我明白了。这简化了我的代码。但是,我还需要从列表中删除文件扩展名。
    【解决方案2】:
    gather_filenames() ->
        [ begin
            "lmx." ++ NF = lists:reverse(FN),
            lists:reverse(NF)
          end || FN <- filelib:wildcard("*.xml", "C:/XML") ].
    

    或者更简单但我不知道filename:rootname/1引入时的版本

    gather_filenames() ->
        [ filename:rootname(FN) || FN <- filelib:wildcard("*.xml", "C:/XML") ].
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2012-06-29
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多