Graccvs文件正文提取开发组件支持各种文件提取正文,为Lucene/CLucene, Elasticsearch, Sphinx等全文检索工具,为OA,ERP,CRM系统使用文件提供文件正文使用和搜索,支持常见各种文件格式”.pdf", ".doc", ".odt", ".docx", ".dotm", ".docm", ".wps", ".xls", ".xlsx", ".xlsm", ".xltm", ".et", ".ppt", ".pptx", ".potm", ".pptm", ".ppsm", ".dps", ".ofd"(电子发票版式文件), ".rtf",".html", ".htm", ".mht", ".mhtml", ".eml", ".emmx", "xmind", "gmind", ".chm", ".zip" 等。

Graccvs提供免费版本,以下是调用过程及代码,起来文件输入修改为要提取的文件名称和类型即可。

以下是使用DLL过程:

1:建立Console Application工程或者 VCL Application工程。
2:拷贝 graccvs64.dll到工程中, 默认在exe输出位置。
3:拷贝graccvsTest.dpr文件相关代码 。
4:编译运行工程 。
5:点击这里下载完整工程包,这里下载最新DLL文件。

graccvsTest.dpr :

program graccvsTest;{$APPTYPE CONSOLE}
{$R *.res}usesSystem.SysUtils,Windows,Types,DateUtils,Classes;type// ----------------------以下为函数说明----------------------// DLL加载并设置动态库需要的临时文件夹,且对此文件夹要有读写权限TLoad = procedure(TempDir: PRawByteString); cdecl;(*注册软件:方式1:输入参数,corp为公司名称licText为注册码方式2:把授权文件grauth.lic保存到动态库相同文件夹,调用TAuth函数(corp, licText都为空)系统自动加载grauth.lic返回值:0:免费版本许可为空1:许可正常2:序列号(公司授权名称)错误3:加密数据格式错误4:许可过期5:许可验证错误6:无效的许可7:未知错误注1:如果注册失败,系统变为免费版本注2:免费版也需要调用此函数,corp和licText都为空*)TAuth = function(Corp, LicText: PRawByteString): Cardinal; cdecl;// 释放TToString, THttpToString等函数的返回指针TFreeString = procedure(P: PRawByteString); cdecl;// 得到最后的错误信息TLastError = function(): PRawByteString; cdecl;// 提供文件正文// Infile输入文件地址, 返回UTF-8编码字符串数据指针(此指针需要使用TFreeString函数释放内存)TToString = function(Infile: PRawByteString): PRawByteString; cdecl;// 提供文件正文,并保存到目标文件// Infile输入文件地址, Outfile为TXT目标文件文件地址TToTextFile = function(Infile, Outfile: PRawByteString): Cardinal; cdecl;// 提取Http/Https文件,返回字符串数据指针// Url=Http/Https地址// FileExt=文件类型(比如:".pdf"),// Timeout=超时设置,超过此数值系统终止下载文件。单位为毫秒,默认为0(等待文件下载直到完成)// HttpParams=JSON格式Header数据和Cookie数据,默认为空(*JSON格式如下:{"headers":[{名称1: 值1},{名称2: 值2},...],"cookies":[{"name": 名称(字符串), "value": 值(字符串), "expires": 有效期(整数,单位毫秒),"path": 路径(字符串), "domain": 域名(字符串)},{"name": 名称(字符串), "value": 值(字符串), "expires": 有效期(整数,单位毫秒),"path": 路径(字符串), "domain": 域名(字符串)}...]}例如:{"headers":[{"client_id": "g01x9"}, {"client_secret": "e23c89cc9fe"}, {"client_index": 10092}],"cookies":[{"name": "ga", "value": "1020", "expires":36000000, "path": "/hx/", "domain":"www.gaya-soft.cn"},{"name": "xc3", "value": "10099", "expires":240000, "path": "", "domain":""}]}*)// 返回UTF-8编码字符串数据指针(此指针需要使用TFreeString函数释放内存)THttpToString = function(Url, FileExt: PRawByteString; Timeout: Cardinal; HttpParams: PRawByteString): PRawByteString; cdecl;// 下载Http文件,并提取文本,保存到目标文件// Outfile为TXT目标文件文件地址,其他参数和THttpToString参数相同THttpToTextFile = function(Url, FileExt, Outfile: PRawByteString; Timeout: Cardinal; HttpParams: PRawByteString): Cardinal; cdecl;// 文件提取异步任务, Infile输入文件地址, Outfile为TXT目标文件文件// 如果提取某个文件错误,则 Outfile的内容如下格式: @ErrCode:错误代码, ErrMessage:错误提示TAddTask = procedure(InFilePtr, OutTxtFilePtr: PRawByteString); cdecl;// 异步提取Http文件任务,参数同 THttpToTextFile 函数TAddHttpTask = procedure(Url, FileExt, OutTxtFile: PRawByteString; Timeout: Cardinal;Params: PRawByteString); cdecl;// 开始执行异步任务,返回值=1开始执行, 其他值未识别// =2 免费版不支持此功能,=3 没有可以执行的任务 ,=4 当前任务未完成TAsyncStart = function(): Cardinal; cdecl;// 停止任务TAsyncStop = procedure(); cdecl;// 一直等待,直到全部异步任务结束TAsyncWait = procedure(); cdecl;// 得到执行异步任务的状态, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成TAsyncState = function(): Cardinal; cdecl;// 设置执行异步任务的并发数量(不大于软件授权数量),返回并发数量TAsyncMaxProcs = function(Num: Cardinal): Cardinal;// 关闭动态库前调用此函数释放资源,否则关闭DLL会发生错误TUnload = procedure(); cdecl;// 软件注册序列号,用此序列号申请注册码。每次调用返回的值是不一样的// 返回UTF-8编码字符串数据指针(此指针需要使用TFreeString函数释放内存)TUuid = function(): PRawByteString; cdecl;// 提取文本的错误类型
constTFE_OK = 0;TFE_UNKNOW = 1;TFE_FILE_NOTEXIST = 2;TFE_SAVE_ERROR = 3;TFE_OUTSIZE = 4;TFE_UNSUPPORTED = 5;TFE_ERROR_INTERFACE = 6;TFE_HTTP_ERR = 7;TFE_HTTP_FILE_NULL = 8;TFE_LICENCE_ERR = 9;varPLib: DWORD;FToTextFile: TToTextFile;FToString: TToString;FHttpToTextFile: THttpToTextFile;FHttpToString: THttpToString;FFreeString: TFreeString;FLastError: TLastError;function DllInit(): Boolean;
varP2, P3, P4, P5, P6, P7: Pointer;
beginP2 := GetProcAddress(PLib, 'LastErr');P3 := GetProcAddress(PLib, 'ToTextFile');P4 := GetProcAddress(PLib, 'ToString');P5 := GetProcAddress(PLib, 'HttpToTextFile');P6 := GetProcAddress(PLib, 'HttpToString');P7 := GetProcAddress(PLib, 'FreeString');if (P2 <> nil) and (P3 <> nil) and (P4 <> nil) and (P5 <> nil) and (P6 <> nil) and (P7 <> nil) thenbeginFLastError := TLastError(P2);FToTextFile := TToTextFile(P3);FToString := TToString(P4);FHttpToTextFile := THttpToTextFile(P5);FHttpToString := THttpToString(P6);FFreeString := TFreeString(P7);Result := True;endelse beginResult := False;end;
end;// DLL初始化和设置软件授权
procedure LoadAndAuth();
varP1, P2: Pointer;Load: TLoad;Auth: TAuth;TempDir: RawByteString;Corp, LicTest: RawByteString;
beginP1 := GetProcAddress(PLib, 'Load');P2 := GetProcAddress(PLib, 'Auth');if (P1 <> nil) and (P2 <> nil) then beginLoad := TLoad(P1);// DLL工作的临时文件夹 ,需要程序对此文件夹有读写文件夹权限TempDir := Utf8Encode('tmp\');Load(PRawByteString(TempDir));//Auth := TAuth(P2);// 调用软件注册,免费版也需要调用此函数(传空值即可)Corp := Utf8Encode('Beij Gaya');LicTest := Utf8Encode('');Auth(PRawByteString(Corp), PRawByteString(LicTest));end;
end;procedure Unload();
varP: Pointer;Unload: TUnload;
beginP := GetProcAddress(PLib, 'Unload');if (P <> nil) then beginUnload := TUnload(P);Unload();end;
end;// 根据错误类型返回错误信息
function ErrText(Code: Cardinal): string;
begincase Code ofTFE_OK:Result := 'ok';TFE_UNKNOW:Result := '未知错误';TFE_FILE_NOTEXIST:Result := '提取源文件不存在';TFE_SAVE_ERROR:Result := '保存目标文件失败';TFE_OUTSIZE:Result := '提取的源文件超出设置的大小范围';TFE_UNSUPPORTED:Result := '不支持的提取文件格式';TFE_ERROR_INTERFACE:Result := '得到接口失败';TFE_HTTP_ERR:Result := 'HTTP下载文件失败';TFE_HTTP_FILE_NULL:Result := 'HTTP文件为空';TFE_LICENCE_ERR:Result := '软件许可错误';end;
end;// 调用DLL函数
function FileToText(SourceFile, OutTextFile: string): Cardinal;
varInUtf8Name, OutUtf8Name: RawByteString;
begin// 文件名称要UTF-8编码InUtf8Name := Utf8Encode(SourceFile);OutUtf8Name := Utf8Encode(OutTextFile);Result := FToTextFile(PRawByteString(InUtf8Name), PRawByteString(OutUtf8Name));
end;// 测试提取正文,保存到目标文本文件
procedure FileToTextTest();
varR: Cardinal;P: Pointer;S: RawByteString;Err, Err2: string;
beginWriteln(TimeToStr(Now) + ' -- start');R := FileToText('D:\graccvs\files\简可信模板OCR识别工具帮助.docx', 'D:\graccvs\files\grcv001.txt');if R = 0 thenWriteln(TimeToStr(Now) + ' -- end')else begin// 得到错误方式1: 根据R值调用函数ErrText得到具体错误信息, 此方式速度快Err := ErrText(R);Writeln(Err);// 方式2:调用DLL函数,得到具体错误信息, 此方式错误信息更加准确P := FLastError();S := RawByteString(PAnsiChar(P));Err2 := Utf8ToWideString(S);//Writeln(Err2)end;
end;// 调用DLL函数
function FileToString(SourceFile: string; var Err: string): string;
varInUtf8Name, S: RawByteString;P: Pointer;Index, R: Integer;
begin// 文件名称要UTF-8编码InUtf8Name := Utf8Encode(SourceFile);P := FToString(PRawByteString(InUtf8Name));if P <> nil then begintryS := PAnsiChar(P);Result := Utf8ToWideString(S);finallyFFreeString(P);end;// 如果得到正文失败, 返回格式为 @ErrCode:x// x为整数,可以根据x值调用函数ErrText得到具体错误信息Index := Pos('@ErrCode:', Result);if Index > 0 then beginR := StrToIntDef(Copy(Result, Index + 9, 1), 0);Err := ErrText(R);endelseErr := '';endelse beginResult := '';Err := '得到文本失败';end;
end;// 测试提取正文
procedure ToStringText();
varS, Err: string;
beginWriteln(TimeToStr(Now) + ' -- start');//S := FileToString('D:\graccvs\files\Adobe Intro.ofd', Err);if Err <> '' thenWriteln(Err)elseWriteln(S);
end;// Http文件提取文件正文
function HttpToString(Url, FileExt: string; Timeout: Integer; var Err: string): string;
varInUtf8Url, FileExtUtf8, S: RawByteString;P: Pointer;Index, R: Integer;
begin// 文件名称要UTF-8编码InUtf8Url := Utf8Encode(Url);// 要提取的文件类型,比如 .docx, .ppt, .pdf, .html 等文件后缀FileExtUtf8 := Utf8Encode(FileExt);// 调用DLL中HttpToString函数, Timeout为超时设置,单位为毫秒P := FHttpToString(PRawByteString(InUtf8Url), PRawByteString(FileExtUtf8), Timeout, nil);if P <> nil then begintryS := PAnsiChar(P);Result := Utf8ToWideString(S);finallyFFreeString(P);end;// 如果得到正文失败, 返回格式为 @ErrCode:x// x为整数,可以根据x值调用函数ErrText得到具体错误信息Index := Pos('@ErrCode:', Result);if Index > 0 then beginR := StrToIntDef(Copy(Result, Index + 9, 1), 0);Err := ErrText(R);endelseErr := '';endelse beginResult := '';Err := '得到文本失败';end;
end;// Http文件提取文件正文
procedure HttpToStringTest();
varS, Err: string;
beginWriteln(TimeToStr(Now) + ' -- start');//S := HttpToString('https://www.gaya-soft.cn/dfs/v2/graccvs文件正文提取接口.pdf', '.pdf', 60 * 1000, Err);if Err <> '' thenWriteln(Err)elseWriteln(S);
end;// 调用DLL HttpToTextFile函数, Timeout = HTTP 超时设置
function HttpToTextFile(Url, FileExt, OutTextFile: string; Timeout: Integer): Cardinal;
varJsonStr: string;UrlUtf8, FileExtUtf8, OutUtf8Name, Params: PRawByteString;
begin// 文件名称要UTF-8编码UrlUtf8 := PRawByteString(Utf8Encode(Url));// 要提取的文件类型,比如 .docx, .ppt, .pdf, .html 等文件后缀FileExtUtf8 := PRawByteString(Utf8Encode(FileExt));// 目标文件OutUtf8Name := PRawByteString(Utf8Encode(OutTextFile));// http请求参数,默认为空JsonStr := '{"headers":[{"client_id": "g01x9"}, {"client_secret": "e23c89cc9fe"}],' + //'"cookies":[{"name": "ga", "value": "1020", "expires":36000000, "path": "/"}]}';// http参数Params := PRawByteString(Utf8Encode(JsonStr));// Timeout为超时设置,单位为毫秒Result := FHttpToTextFile(UrlUtf8, FileExtUtf8, OutUtf8Name, Timeout, Params);
end;procedure HttpFileToTextTest();
varR: Cardinal;Err  : string;
beginWriteln(TimeToStr(Now) + ' -- start');//R := HttpToTextFile('https://www.gaya-soft.cn/dfs/v2/简可信模板OCR识别工具帮助.docx', //'.docx', 'D:\graccvs\files\grcv002.txt', 0);if R = 0 thenWriteln(TimeToStr(Now) + ' -- end')else beginErr := ErrText(R);Writeln(Err);end;
end;// ---------------异步批量文件提取,适合多线程处理很多文件---------------
procedure AsyncTest();
varStart: TAsyncStart;// 增加一个提取任务procedure AddFileTask();varP: Pointer;AddTask: TAddTask;Infile, Outfile: RawByteString;beginP := GetProcAddress(PLib, 'AddTask');if P <> nil then beginAddTask := TAddTask(P);Infile := Utf8Encode('D:\graccvs\files\简可信模板OCR识别工具帮助.docx');Outfile := Utf8Encode('D:\graccvs\files\grta001.txt');AddTask(PRawByteString(Infile), PRawByteString(Outfile));//Infile := Utf8Encode('D:\graccvs\files\Adobe Intro.ofd');Outfile := Utf8Encode('D:\graccvs\files\grta002.txt');AddTask(PRawByteString(Infile), PRawByteString(Outfile));// 可以增加N个文件end;end;// 增加一个HTTP任务procedure AddHttpTask();varP: Pointer;AddHttpTask: TAddHttpTask;Url, FileExt, Outfile: RawByteString;beginP := GetProcAddress(PLib, 'AddHttpTask');if P <> nil then beginAddHttpTask := TAddHttpTask(P);Url := Utf8Encode('https://www.gaya-soft.cn/dfs/v2/简可信模板OCR识别工具帮助.docx');FileExt := Utf8Encode('.docx');Outfile := Utf8Encode('D:\graccvs\files\grtb001.txt');// 参数设置参考THttpToString函数定义。此处设置下载文件180秒超时AddHttpTask(PRawByteString(Url), PRawByteString(FileExt), PRawByteString(Outfile), 0, nil);//Outfile := Utf8Encode('D:\graccvs\files\grtb002.txt');AddHttpTask(PRawByteString(Url), PRawByteString(FileExt), PRawByteString(Outfile), 0, nil);end;end;procedure Run1();varR: Integer;P: Pointer;Wait: TAsyncWait;beginP := GetProcAddress(PLib, 'AsyncWait'); // 等待任务完成函数if P = nil thenExit;//Wait := TAsyncWait(P);// 开始任务R := Start();//if R = 1 then beginWait();Writeln('任务完成');endelse if R = 2 thenWriteln('免费版不支持此功能')else if R = 3 thenWriteln('没有可以执行的任务')else if R = 4 thenWriteln('当前任务未完成');end;procedure Run2();varR, X: Integer;P: Pointer;State: TAsyncState;Stop: TAsyncStop;Tm: TDateTime;IsOver: Boolean;beginP := GetProcAddress(PLib, 'AsyncState');if P = nil thenExit;State := TAsyncState(P);//P := GetProcAddress(PLib, 'AsyncStop');if P = nil thenExit;Stop := TAsyncStop(P);// 开始任务R := Start();//IsOver := False;if R = 1 then beginTm := IncMinute(Now, 5); // 5分钟后结束任务while Now < Tm do begin// 判断任务情况, =0 没开始, =1 正在处理中,=2 已中断, =99 处理完成X := State();if X = 1 thenSleep(500)else if X = 99 then beginIsOver := True; // 处理完成Break;endelseBreak;end;//if not IsOver thenStop(); // 结束任务endelse if R = 2 thenWriteln('免费版不支持此功能')else if R = 3 thenWriteln('没有可以执行的任务')else if R = 4 thenWriteln('当前任务未完成');end;varP: Pointer;MaxProcs: TAsyncMaxProcs;begin// 设置线程数量函数P := GetProcAddress(PLib, 'AsyncMaxProcs');if P = nil thenExit;MaxProcs := TAsyncMaxProcs(P);// 开始任务函数P := GetProcAddress(PLib, 'AsyncStart');if P = nil thenExit;Start := TAsyncStart(P);//MaxProcs(6); // 同时运行6个任务// ----------方式1:开始任务,等待全部任务完成----------AddHttpTask(); // 增加HTTP任务AddFileTask(); // 增加N个任务Run1();// ----------方式2:判断执行情况,超时退出,主动结束任务----------AddHttpTask(); // 增加HTTP任务AddFileTask(); // 增加N个任务Run2();
end;// 得到软件注册序列号
procedure Uuid();
varProc, P2: Pointer;Uuid: TUuid;S: RawByteString;
beginProc := GetProcAddress(PLib, 'Uuid');if (Proc <> nil) then beginUuid := TUuid(Proc);P2 := Uuid();if P2 <> nil then begintryS := PAnsiChar(P2);S := RawByteString(S);//Writeln(Utf8ToWideString(S));finallyFFreeString(P2);end;end;end;
end;begin// 加载DLLPLib := LoadLibrary('graccvs64.dll');  //默认64位系统,32位DLL或者接口更新请到官网if PLib = 0 then beginWriteln('Load dll error');Exit;end;try// 加载DLL参数if not DllInit() then beginWriteln('Load function error');Exit;end;//LoadAndAuth();//Writeln('Dllload');// Uuid();// 测试提取文本并返回字符串指针FileToTextTest();// 测试提取文本并保存文本ToStringText();// 测试提取网络文件文本,并保存文本到本地文件HttpFileToTextTest();// 测试提取网络文件并返回字符串指针HttpToStringTest();// 测试异步批量提取任务AsyncTest();// 调用此函数,卸载DLL参数,和DllInit对应使用Unload();Writeln('Dll Unload');finallySleep(200); // 请勿删除此Sleep语句FreeLibrary(PLib);Sleep(50);end;end.

DLL 动态链接库函数调用过程:
1:加载DLL(windows),SO(Linux)动态库。
2:调用初始化函数Load设置动态链接库需要的临时文件夹。
3:调用Auth注册,免费版本设置为空。
4:调用文件函数ToTextFile、HttpToString等提取N个不同文件的正文,或者使用异步函数批量处理文件。
5:完成文件提取任务后调用 Unload函数,释放资源组件使用的资源。
6:关闭动态库。

Delphi文件正文提取开发组件--文件内容搜索的高效工具相关推荐

  1. Graccvs文件正文提取开发组件--文件内容搜索的利器

    Graccvs组件为Lucene/CLucene, Elasticsearch, Sphinx等全文检索工具,OA, ERP, CRM,网盘,文件管理等其他系统提供文件摘要及搜索前置服务.可以为安全网 ...

  2. linux下压缩gz文件怎么打开,在Linux系统中打开或解压缩.gz文件及提取tar.gz文件的方法...

    本文本文介绍如何打开(或解压缩).gz文件的方法.Gzip是一种流行的压缩算法,可在保持原始文件模式.所有权和时间戳的同时减小文件大小,此算法通常用于压缩Web元素,以加快页面加载速度.按照约定,使用 ...

  3. java对文件读取_java开发中文件读取的方法总结

    1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件 ...

  4. android文件加解密开发,Android文件加密解密的实现

    [实例简介] 最近项目中需要用到加解密功能,言外之意就是不想让人家在反编译后通过不走心就能获取文件里一些看似有用的信息 [实例截图] [核心代码] TestCipher └── TestCipher ...

  5. VC语言文件正文分析器--支持格式常用文件格式

    Graccvs文件正文提取开发组件支持各种文件提取正文,为OA,ERP,CRM系统使用文件提供文件正文使用和搜索,支持常见各种文件格式".pdf", ".doc" ...

  6. Android系统中如何得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)

    在Android平台下,办公系统,ERP,CRM等开发过程中,需要对Doc, docx, xls, xlsx, ppt, ppts, pdf, html等各种格式的文件内容进行搜索和查找,实现这些格式 ...

  7. Linux 平台下如何使用GCC得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)

    在文件数据挖掘处理技术中,如何从文本数据中抽取有价值的信息和知识是一个重要的数据挖据分支,是机器学习.自然语言处理.数理统计的基础技术之一,是信息检索,机器学习,AI智能等高端技术的的底层技术支持之一 ...

  8. Linux + JAVA得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)

    在文件数据挖掘处理技术中,如何从文本数据中抽取有价值的信息和知识是一个重要的数据挖据分支,是机器学习.自然语言处理.数理统计的基础技术之一,是信息检索,机器学习,AI智能等高端技术的的底层技术支持之一 ...

  9. Windows+GCC得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)

    Graccvs组件智能分析提取其他各种文件中文本,为自然语言信息检索,机器学习等高端技术提供底层支持的技术组件,是Lucene/CLucene, Elasticsearch, Sphinx等全文检索工 ...

最新文章

  1. java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)
  2. Android 进程常驻(0)----MarsDaemon使用说明
  3. Lua中的函数环境、_G及_ENV
  4. flink实时流遇到的问题排查——部分数据未落库redis问题
  5. [转]踏实从小事做起, 才能有大发展
  6. (转,记录用)jQuery页面加载初始化的3种方法
  7. go还是python 知乎_知乎用Go替代Python
  8. 推荐 20 款 IDEA 主题!
  9. 施耐德 m340 编程手册_施耐德电气自动化软件汇总
  10. oracle基本操作语句大全
  11. win7怎么关闭配置计算机,Win7电脑怎么设置定时关机?
  12. JWT令牌生成与校验
  13. 个人游戏经历及游戏体验(解谜向)
  14. HTML 页面中点击 a标签实现添加QQ好友功能
  15. 小僧尽知他的备细出 水浒
  16. 低温工作笔记本计算机,电脑低温自动关机
  17. PrimeNG之FileUpload
  18. jQuery小游戏——小鸟飞行闪躲
  19. 20. 有效的括号-C语言
  20. 微信开发提示【防盗号或诈骗,请不要输入QQ密码】

热门文章

  1. 中国地质大学英语语音学习笔记(八):英语重音与重音移位——为发音添彩
  2. 性能测试中的二八原则
  3. 女大学生的280块川西环游功略(含帐单)
  4. [转]作为黑客的你应该拥有的10个小工具
  5. 计算机网络原理第七章——Internet 原理
  6. 在excel中等间距抽取数据
  7. 全国各地级市、区县房价最全数据(更新至2021年7月)
  8. c++ 小游戏 NO 9 最后主函数
  9. 在 markdown 中使用表情符号
  10. 报错:Entering emergency mode. Exit the shell to continue 解决