获取可执行文件版本号(装载)

本文提供了一个通用的方法来查询任何可执行文件的版本信息,适用于C++builder和VC。通过示例代码展示了如何使用GetFileVersionInfoSize等API获取指定文件的版本详情。

这个例子就是查询任何可执行文件的版本信息  
  并且   C++builder   和   VC   都通用,只需要把   AnsiString   替换成   CString   就行了。  
  下面是完整例子:  
  CString   IS_GetAppVersion(char*   AppName)  
  {  
      CString   AppVersion;  
      //AppVersion=IS_GetAppCreateTime(AppName);  
   
      DWORD   RessourceVersionInfoSize;  
      DWORD   JustAJunkVariabel;  
      char*   VersionInfoPtr;  
      struct   LANGANDCODEPAGE  
   {  
          WORD   wLanguage;  
          WORD   wCodePage;  
      }*TranslationPtr;  

      char*   InformationPtr;  
      UINT     VersionInfoSize;  
      char     VersionValue[255];  
   
      RessourceVersionInfoSize=GetFileVersionInfoSize(AppName,&JustAJunkVariabel);  
      if(0!=RessourceVersionInfoSize)  
      {  
          VersionInfoPtr = new char[RessourceVersionInfoSize];  
          if(GetFileVersionInfo(AppName,0,RessourceVersionInfoSize,VersionInfoPtr))  
          {  
              if(!VerQueryValue(   VersionInfoPtr, TEXT("VarFileInfo//Translation"),(LPVOID*)&TranslationPtr,&VersionInfoSize))  
              {  
                  delete[]   VersionInfoPtr;  
                  return   AppVersion;  
              }  
          }  
   
          //   retrieve   File   Description  
          wsprintf(VersionValue,TEXT("//StringFileInfo//%04x%04x//FileVersion"),TranslationPtr[0].wLanguage,TranslationPtr[0].wCodePage);  
          if(!VerQueryValue( VersionInfoPtr,VersionValue,(LPVOID*)&InformationPtr,&VersionInfoSize))  
          {  
              delete[]   VersionInfoPtr;  
              return   AppVersion;  
          }  
          if(strlen(InformationPtr)>0)   //Not   Null  
          {  
              AppVersion=CString(InformationPtr);  
          }  
          delete[]   VersionInfoPtr;  
      }  
      return AppVersion;  
  }  
   
  void   CGetFileVersionDlg::OnButton1()    
  {  
  CString   strVersion   =   IS_GetAppVersion("d://winnt//winhlp32.exe");  
  AfxMessageBox(strVersion);  
  }  

/*

 char AppName[MAX_PATH];
 GetModuleFileName(NULL, AppName, MAX_PATH);

 CString   AppVersion;  
 DWORD   RessourceVersionInfoSize;  
 DWORD   JustAJunkVariabel;  
 char*   VersionInfoPtr;  
 struct   LANGANDCODEPAGE   {  
  WORD   wLanguage;  
  WORD   wCodePage;  
 }   *TranslationPtr;  
 char*   InformationPtr;  
 UINT     VersionInfoSize;  
 char     VersionValue[255];  
   
 RessourceVersionInfoSize=GetFileVersionInfoSize(AppName,&JustAJunkVariabel);  
 if(0!=RessourceVersionInfoSize)  
 {  
  VersionInfoPtr=new   char[RessourceVersionInfoSize];  
  if(GetFileVersionInfo(AppName,0,RessourceVersionInfoSize,VersionInfoPtr))  
  {  
   if(!VerQueryValue(  
    VersionInfoPtr,  
    TEXT("VarFileInfo//Translation"),  
    (LPVOID*)&TranslationPtr,  
    &VersionInfoSize))  
   {  
    delete[]   VersionInfoPtr;  
    return FALSE;  
   }  
  }  
  
  //retrieve   File   Description  
  wsprintf(VersionValue,  
   TEXT("//StringFileInfo//%04x%04x//FileVersion"),  
   TranslationPtr[0].wLanguage,  
   TranslationPtr[0].wCodePage);  
  
  if(!VerQueryValue(  
   VersionInfoPtr,  
   VersionValue,  
   (LPVOID*)&InformationPtr,  
   &VersionInfoSize))  
  {  
   delete[]   VersionInfoPtr;  
   return FALSE;  
  }  
  if(strlen(InformationPtr)>0)   //Not   Null  
  {  
   AppVersion=CString(InformationPtr);  
  }  
  delete[] VersionInfoPtr;  
 }  
*/

<think>我们正在使用Doris数据库的ctl工具(即Doris的导入工具)来加载.dat文件数据。通常,Doris支持多种数据导入方式,其中使用`mysql load`命令(通过MySQL客户端)或`curl`命令(通过HTTP API)进行数据加载,但用户特别提到了ctl工具,可能指的是`doris-loader`(社区中有时也称为stream load工具)或通过BROKER LOAD的方式。不过,在Doris中,常见的数据导入工具是使用`curl`进行Stream Load,或者通过BROKER LOAD(需要HDFS支持)等。 但是,请注意:Doris并没有一个直接叫做`ctl`的官方命令行工具。用户可能指的是`mysql`命令行工具(因为Doris兼容MySQL协议),然后使用`LOAD DATA`命令?或者是使用`curl`进行Stream Load?或者是指的是Doris提供的`spark-doris-connector`等工具? 不过,根据常见实践,.dat文件通常是文本文件,我们可以使用Stream Load方式(通过HTTP)来导入数据,或者如果数据在HDFS上,则可以使用BROKER LOAD。 假设用户有一个本地的.dat文件,并且想要通过命令行工具导入到Doris,那么最常用的方式是使用curl命令进行Stream Load。 因此,我将按照使用curl进行Stream Load的方式来回答。 步骤: 1. 准备一个.dat文件,文件内容应该是文本格式(如CSV、TSV等),并且符合目标表的列分隔符等要求。 2. 使用curl命令向Doris的HTTP接口发送数据。 基本命令格式如下: ```bash curl --location-trusted -u user:passwd -T data.file -H "label:load_label" -H "column_separator:," http://fe_host:http_port/api/db_name/tbl_name/_stream_load ``` 参数说明: - `-u user:passwd`:Doris的用户名和密码。 - `-T data.file`:指定要上传的文件路径。 - `-H "label:load_label"`:指定本次导入的标签,用于保证幂等性(同一标签多次导入只会成功一次)。标签可以用户自定义,建议包含时间戳和业务信息。 - `-H "column_separator:,"`:指定列分隔符,如果是逗号分隔则用`,`,如果是制表符则用`\t`。根据.dat文件的实际分隔符设置。 - 其他可选参数: - `-H "columns:col1,col2,col3"`:如果文件中的列顺序与表中不一致,或者需要做一些转换,可以用这个参数指定列映射。例如,文件中比表多一列,则可以用`-H "columns: tmp_col, col1, col2"`,然后在表中忽略tmp_col。 - `-H "where: condition"`:导入时进行过滤的条件。 - `-H "max_filter_ratio:0.1"`:最大容忍过滤比例(由于数据不规范等原因),超过则任务失败。 - `-H "timeout:1000"`:超时时间(秒)。 - `-H "strict_mode: true"`:开启严格模式。 3. 执行命令后,会返回一个JSON格式的结果,可以查看导入是否成功。 注意:如果.dat文件很大,可能会超时,可以考虑分批次导入或者使用其他导入方式(如Broker Load)。 如果用户指的是使用MySQL客户端的`LOAD DATA`命令,那么请注意,Doris目前不支持通过MySQL协议的`LOAD DATA LOCAL INFILE`命令(截至2.0版本)。因此,我们通常使用Stream Load或Broker Load。 如果数据在HDFS上,则可以使用Broker Load,语法如下: ```sql LOAD LABEL db_name.label_name ( DATA INFILE("hdfs://path/to/file.dat") INTO TABLE tbl_name COLUMNS TERMINATED BY "," (col1, col2, ...) ) WITH BROKER broker_name PROPERTIES ( "timeout"="3600", "max_filter_ratio"="0.1" ); ``` 然后通过`SHOW LOAD WHERE LABEL = "label_name";`来查看导入状态。 但是,由于用户特别提到要使用ctl命令,并且文件是.dat,我们假设是本地文件,因此使用curl的Stream Load是最直接的方式。 因此,我们给出使用curl导入本地.dat文件的步骤。 示例: 假设我们有一个文件`data.dat`,内容为逗号分隔的文本,目标表在数据库`test_db`中,表名为`test_tbl`,Doris FE的HTTP端口为8030,用户为root,密码为空(实际生产环境请设置密码),列分隔符为逗号。 命令如下: ```bash curl --location-trusted -u root: -T data.dat -H "label:load_20240315_123456" -H "column_separator:," http://127.0.0.1:8030/api/test_db/test_tbl/_stream_load ``` 如果密码不为空,例如密码为123,则: ```bash curl --location-trusted -u root:123 -T data.dat -H "label:load_20240315_123456" -H "column_separator:," http://127.0.0.1:8030/api/test_db/test_tbl/_stream_load ``` 注意:如果.dat文件的分隔符不是逗号,请相应修改`column_separator`的值。 如果导入成功,返回的JSON中会显示`"Status":"Success"`。 如果导入失败,请查看返回的JSON中的`Message`字段获取错误信息。 相关问题: 1. 如何提高Stream Load导入数据的性能? 2. Doris支持哪些数据导入方式?它们分别适用于什么场景? 3. 在导入数据时,如何设置列映射和转换?</think>### Doris数据库通过CTL命令加载.dat文件数据 在Doris中,使用`curl`命令(CTL工具)通过Stream Load方式加载.dat文件数据的步骤如下: #### 1. **基本命令格式** ```bash curl --location-trusted -u <用户名>:<密码> \ -T <数据文件路径>.dat \ -H "label:<唯一导入标签>" \ -H "column_separator:<列分隔符>" \ http://<FE_IP>:<FE_HTTP_PORT>/api/<数据库名>/<表名>/_stream_load ``` #### 2. **关键参数说明** - `-u`:Doris账号(格式:`username:password`) - `-T`:.dat文件路径(支持本地或HDFS路径) - `-H "label"`:**必需**的唯一导入标识(相同标签的重复导入会自动忽略) - `-H "column_separator"`:指定.dat文件的列分隔符(如`,`, `\t`, `|`) - 其他常用Header: ```bash -H "columns:col1,col2,tmp_col3" \ # 列映射 -H "where: col1 > 100" \ # 数据过滤条件 -H "max_filter_ratio:0.1" \ # 最大容忍错误率 -H "timeout:3600" # 超时时间() ``` #### 3. **完整示例** 加载本地`/data/user.dat`到表`test_db.user_tbl`: ```bash curl --location-trusted -u admin:123456 \ -T /data/user.dat \ -H "label:load_user_20240501_001" \ -H "column_separator:|" \ -H "columns: name,age,city,dt=now()" \ # 添加计算列dt http://192.168.1.100:8030/api/test_db/user_tbl/_stream_load ``` #### 4. **结果验证** - **成功响应**: ```json {"Status":"Success","Message":"OK","Label":"load_user_20240501_001"} ``` - **查看导入状态**: ```sql SHOW LOAD WHERE Label="load_user_20240501_001"; ``` #### 5. **注意事项** 1. **文件格式**: - .dat文件需为文本格式(如CSV/TSV) - 支持`gzip`/`bzip2`压缩(自动解压) 2. **错误处理**: - 返回JSON中`Status`为`Fail`时检查`Message`字段 - 常见错误:权限不足、列数不匹配、分隔符错误 3. **性能优化**: - 大文件建议分割为多个<2GB的文件并行加载 - 批量导入时使用异步提交模式[^1] > 提示:对于HDFS上的.dat文件,推荐改用Broker Load方式(通过`CREATE ROUTINE LOAD`命令实现更高吞吐量)[^1]。 --- ### 相关问题 1. Stream Load导入失败时如何查看详细错误日志? 2. 如何对.dat文件中的时间字段进行格式转换后再导入Doris? 3. Doris支持哪些压缩格式的数据文件直接导入? 4. 如何实现.dat文件的增量数据自动加载? [^1]: Doris官方文档:数据导入最佳实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值