Programming Erlang 16.7 练习:检查模块是否需重新编译

版权声明:@潘广宇博客, https://blog.csdn.net/panguangyuu/article/details/89207428

一、题目

编译Erlang文件X.erl后会生成一个X.beam文件(如果编译成功的话)。编写一个程序来检查某个Erlang模块是否需要重新编译。做法是比较相关Erlang文件和beam文件的最后修改时间戳

二、编写

主要是通过判断 .erl 文件与 .beam 文件的修改时间(精确到分),因为编译时.beam文件生成时间一般比.erl文件稍后

-module(checkModuler).
-export([check/1]).

%% 检查模块
check(ModuleName) -> 
    
    % 分别获取.erl与.beam文件的修改时间
    ErlFileTime = getFileModifyTime(ModuleName, ".erl"),
    BeamFileTime = getFileModifyTime(ModuleName, ".beam"),

    case ErlFileTime of
        false -> exit("Erl File Not Found");
        _ -> true 
    end,

    case BeamFileTime of
        false -> exit("Beam File Not Found");
        _ -> true 
    end,

    % 比较两者的时间
    case ErlFileTime =:= BeamFileTime of
        true -> io:format("IT'S NEW~n");
        false -> io:format("NEED TO COMPILE AGAIN~n")
    end.

%% 获取文件的修改时间

getFileModifyTime(ModuleName, Prefix) ->
    try
        Status = file:read_file_info(ModuleName ++ Prefix), 
        {ok,{file_info,
                _Size, _Type, _Access,_Atime,Mtime,_CTime,
                _Mode,_Links,_MajorDevice,_MinorDevice,_Inode,_Uid,_Gid}} = Status,
        
        {{Year, Month, Day}, {Hour, Minute, _Second}} = Mtime,
                
        {Year, Month, Day, Hour, Minute}             % 返回文件的修改时间,精确到分
     
    catch
        error:_X -> false
    end.

或者这个版本(建议):

-module(checkModuler).
-export([check/1]).
-include("/usr/local/lib/erlang/lib/kernel-6.3/include/file.hrl").

check(ModuleName) -> 
    ErlFileTime = getFileModifyTime(ModuleName, ".erl"),
    BeamFileTime = getFileModifyTime(ModuleName, ".beam"),

    case ErlFileTime of
        false -> exit("Erl File Not Found");
        _ -> true 
    end,

    case BeamFileTime of
        false -> exit("Beam File Not Found");
        _ -> true
    end,

    case ErlFileTime =:= BeamFileTime of
        true -> io:format("IT'S NEW~n");
        false -> io:format("NEED TO COMPILE AGAIN~n")
    end.

getFileModifyTime(ModuleName, Prefix) ->    
    try
        {ok, Status} = file:read_file_info(ModuleName ++ Prefix), 
        {{Year, Month, Day}, {Hour, Minute, _Second}} = Status#file_info.mtime,
        {Year, Month, Day, Hour, Minute}
    catch
        error:_X -> false
    end.

猜你喜欢

转载自blog.csdn.net/panguangyuu/article/details/89207428
今日推荐