File 无法使用文件模块编译Erlang文件

File 无法使用文件模块编译Erlang文件,file,erlang,File,Erlang,当我想编译一个简单的文件.erl文件时,我收到了错误消息 $ erlc file.erl /opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34: type date_time() undefined 下面是file.erl的内容 -module(file). -include_lib("kernel/include/file.hrl"). -export([file_info/1]). file_info(Dir) -> {ok

当我想编译一个简单的
文件.erl
文件时,我收到了错误消息

$ erlc file.erl
/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34: type date_time() undefined
下面是file.erl的内容

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

-export([file_info/1]).

file_info(Dir) ->
    {ok, F} = file:read_file_info(Dir),
    io:format("~p~n", [F#file_info.type]).

似乎没有人报告此类问题,我所做的有什么问题吗?

您的代码是正确的,问题在于文件名。Erlang具有库“文件”,因此不能使用此文件名。更改它(别忘了修改源代码),一切都会好起来。

调查编译问题的根本原因很有帮助。编译器发出以下错误:

/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34:type date\u time()未定义

查看
file.hrl
的第34行,我们看到:

ctime  :: file:date_time() | non_neg_integer(),
这是
#file_info{}
记录的
ctime
字段的类型说明符。它声明
ctime
可以保存
文件:date\u time()
类型或
非负整数()类型的值

错误消息特别抱怨
date\u time()
类型,因为它的范围表明它是在
文件中定义的。在本例中,
文件
模块是正在定义和编译的模块,它隐藏了Erlang/OTP
内核
应用程序提供的标准模块。标准的
文件
模块将其
日期_时间()
类型定义如下:

-type date_time() :: calendar:datetime().
但是,我们试图编译的
文件
模块没有。如果添加此类型定义会发生什么

-module(file).
-type date_time() :: calendar:datetime().
-include_lib("kernel/include/file.hrl").

-export([file_info/1]).

file_info(Dir) ->
    {ok, F} = file:read_file_info(Dir),
    io:format("~p~n", [F#file_info.type]).
编译包含添加的类型定义的此版本现在可以工作:

$ erlc file.erl
$
我们已经修复了编译错误,所以让我们尝试使用编译后的模块。我们启动一个Erlang shell:

$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]

{"init terminating in do_boot",{undef,[{file,path_eval,[[".","/Users/user"],".erlang"],[]},{c,f_p_e,2,[{file,"c.erl"},{line,481}]},{init,eval_script,8,[]},{init,do_boot,3,[]}]}}

Crash dump is being written to: erl_crash.dump...done
init terminating in do_boot ()
我们可以在错误消息中看到,尝试调用
文件:path_eval/2
失败,因为它没有定义。因为我们的
文件
模块隐藏了标准shell,但没有提供所有相同的函数,所以只要
文件
模块隐藏了标准shell,我们甚至无法启动Erlang shell


显然,为模块选择不同的名称不仅仅是修复原始编译错误所必需的。

我不确定为什么会出现这种错误,但是
file.erl
已经存在于内核源代码中,因此更改模块名称应该会有所帮助。@ukaszPtaszyński非常感谢