Linux下控制(统计)文件的生成的C代码实现

本文分享了Linux下控制(统计)文件的生成的C代码实现案例,供大家参考,具体内容如下

一、需求描述
不定时地在Linux机器下的某目录中放入文件,文件内容中包含了用户号码、起止时间等字段,现要求编写一程序来统计目前该目录中所有文件中的记录总条数及所有记录中的最早起始时间和最晚结束时间。

例如,该目录中有两个文件Test_1.txt和Test_2.txt,其中Test_1.txt文件内容为:

  • 15696192591|15696192592|20151103 120909|20151103 201545|
  • 15696192593|15696192594|20151103 110909|20151103 191545|
  • 02344273522|02344273523|20160108 110909|20160109 091545|

Test_2.txt文件内容为:

  • 15696192595|15696192596|20151102 120909|20151104 201545|
  • 15696192597|15696192598|20151101 110909|20151103 191545|

即文件中的每条记录的格式为:呼叫号码|被呼叫号码|呼叫起始时间|呼叫结束时间|,要求生成的控制文件CtlFile.txt的内容为:

  • 20151101 110909|20160109 091545|5|

即Test_1.txt和Test_2.txt两个文件中五条记录的开始时间的最小值为“20151101 110909”,结束时间的最大值为“20160109 091545”,目前共处理了5条记录。也就是说,控制文件的格式为:呼叫起始时间最小值|呼叫结束时间最大值|记录总条数|。

二、程序代码
本程序一共包括了三个代码文件:main.c、CtlFileCreate.c和CtlFileCreate.h,具体代码如下:

main.c

/**********************************************************************
* 版权所有 (C)2016, Zhou Zhaoxiong。
*
* 文件名称:CtlFileCreate.c
* 文件标识:无
* 内容摘要:目录中文件的读取及控制文件的生成
* 其它说明:无
* 当前版本:V1.0
* 完成日期:20160109
*
**********************************************************************/
#include "CtlFileCreate.h"

/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期    版本号   修改人      修改内容
* -------------------------------------------------------------------
* 20160109    V1.0   Zhou Zhaoxiong    创建
***********************************************************************/

INT32 main()
{
  ReadCtlFile();  // 获取控制文件存放路径、控制文件全路径名及文件内容字段值

  ReadSrcFileAndWriteCtlFile();  // 扫描源文件目录, 并写控制文件

  return 0;
}

CtlFileCreate.h

/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:CtlFileCreate.h
* 文件标识:无
* 内容摘要:目录中文件的读取及控制文件的生成
* 其它说明:无
* 当前版本:V1.0
* 完成日期:20151102
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

// 数据类型重定义
typedef unsigned char    UINT8;
typedef unsigned short int UINT16;
typedef unsigned int    UINT32;
typedef signed  int    INT32;
typedef unsigned char    BOOL;

// 参数类型
#define MML_INT8_TYPE    0
#define MML_INT16_TYPE   1
#define MML_INT32_TYPE   2
#define MML_STR_TYPE    3

#define TRUE     (BOOL)1
#define FALSE    (BOOL)0

// 字段最大长度
#define MAX_RET_BUF_LEN   1024

// 源文件字段结构体
typedef struct
{
  UINT8 szSrcNumber[50];
  UINT8 szDstNumber[50];
  UINT8 szDataStartTime[50];
  UINT8 szDataEndTime[50];
} T_SrcFileContent;

// 函数声明
void Sleep(UINT32 iCountMs);
void ReadCtlFile(void);
void ReadSrcFileAndWriteCtlFile(void);
void GetSrcFileContentAndWriteCtlFile(UINT8 *pszSrcFileName);
void GetSrcFileFieldValue(UINT8 *pszContentLine, T_SrcFileContent *ptSrcFileContent);
void GetCtlFileContentAndWrite(T_SrcFileContent *ptSrcFileContent, UINT8 *pszContentBuffer);
BOOL GetValueFromStr(UINT16 iSerialNum, UINT8 iContentType, UINT8 *pSourceStr, UINT8 *pDstStr, UINT8 cIsolater, UINT32 iDstStrSize);
void RemoveLineEnd(UINT8 *pszStr);
void WriteToCtlFile(UINT8 *pszContentLine);

CtlFileCreate.c

/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:CtlFileCreate.c
* 文件标识:无
* 内容摘要:目录中文件的读取及控制文件的生成
* 其它说明:无
* 当前版本:V1.0
* 完成日期:20151102
*
**********************************************************************/
#include "CtlFileCreate.h"

// 全局变量
UINT8 g_szSourceDir[500]  = {0};     // 需扫描的源目录
UINT8 g_szCtlFileDir[500]  = {0};     // 生成的控制文件的存放目录
UINT8 g_szSourceBakDir[500] = {0};     // 处理之后的源文件的备份目录
UINT8 g_szCtlFileName[256] = {0};     // 控制文件全路径名
UINT8 g_szDataStartTime[50] = {0};     // 所有源文件中数据记录的最早开始时间
UINT8 g_szDataEndTime[50]  = {0};     // 所有源文件中数据记录的最晚结束时间
UINT32 g_iRecordsSum     = 0;      // 已处理的记录的总条数

/**********************************************************************
* 功能描述: 读取控制文件中的开始时间、结束时间和记录条数
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void ReadCtlFile(void)
{
  UINT8 *pszHomePath = NULL;
  FILE *fpCtlFile  = NULL;
  UINT8 szBuf[500] = {0}; 

  // 读取控制文件中的开始时间、结束时间和记录条数, 如果是当天程序重启, 则记录条数继续编号
  pszHomePath = getenv("HOME");
  if (pszHomePath == NULL)
  {
    return;
  }

  snprintf(g_szCtlFileDir, sizeof(g_szCtlFileDir)-1, "%s/zhouzhaoxiong/zzx/CtlFileCreate/CtlFile", pszHomePath); // 控制文件存放目录

  snprintf(g_szCtlFileName, sizeof(g_szCtlFileName)-1, "%s/CtlFile.txt", g_szCtlFileDir); // 控制文件全路径名

  fpCtlFile = fopen(g_szCtlFileName, "r");
  if (fpCtlFile != NULL)
  {
    fgets(szBuf, sizeof(szBuf), fpCtlFile);

    // 获取开始时间g_szDataStartTime
    if (TRUE != GetValueFromStr(1, MML_STR_TYPE, szBuf, g_szDataStartTime, '|', sizeof(g_szDataStartTime)))
    {
      printf("ReadCtlFile: exec GetValueFromStr to get g_szDataStartTime failed!\n");
      return;
    }

    // 获取结束时间g_szDataEndTime
    if (TRUE != GetValueFromStr(2, MML_STR_TYPE, szBuf, g_szDataEndTime, '|', sizeof(g_szDataEndTime)))
    {
      printf("ReadCtlFile: exec GetValueFromStr to get g_szDataEndTime failed!\n");
      return;
    }

    // 获取记录条数g_iRecordsSum
    if (TRUE != GetValueFromStr(3, MML_INT32_TYPE, szBuf, (UINT8 *)&g_iRecordsSum, '|', sizeof(g_iRecordsSum)))
    {
      printf("ReadCtlFile: exec GetValueFromStr to get g_iRecordsSum failed!\n");
      return;
    }

    fclose(fpCtlFile);
    fpCtlFile = NULL;

    printf("ReadCtlFile: DataStartTime=%s, DataEndTime=%s, RecordsSum=%d\n", g_szDataStartTime, g_szDataEndTime, g_iRecordsSum);
  }
}

/**********************************************************************
* 功能描述: 扫描源文件目录, 并写控制文件
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void ReadSrcFileAndWriteCtlFile(void)
{
  UINT8 *pszHomePath    = NULL;
  UINT8 szCommandBuf[500] = {0};
  UINT8 szSrcFile[500]   = {0}; 

  DIR      *pDir  = NULL;
  struct dirent *pDirent = NULL;

  pszHomePath = getenv("HOME");
  if (pszHomePath == NULL)
  {
    return;
  }

  snprintf(g_szSourceDir,  sizeof(g_szSourceDir)-1,  "%s/zhouzhaoxiong/zzx/CtlFileCreate/SrcFile", pszHomePath);   // 源文件存放目录

  snprintf(g_szSourceBakDir, sizeof(g_szSourceBakDir)-1, "%s/zhouzhaoxiong/zzx/CtlFileCreate/SrcFile_bak", pszHomePath); // 源文件备份目录

  while (1)
  {
    pDir = opendir(g_szSourceDir);
    if (NULL == pDir)
    {
      printf("ReadSrcFileAndWriteCtlFile: pDir is NULL!\n");
      continue;
    }

    while ((pDirent = readdir(pDir)) != NULL)  // 扫描源目录, 获取文件名
    {
      if (strncmp(pDirent->d_name, "Test_", strlen("Test_")) == 0)   // 如果匹配上了源文件的前缀, 则读取文件内容并写控制文件
      {
        memset(szSrcFile, 0x00, sizeof(szSrcFile));
        snprintf(szSrcFile, sizeof(szSrcFile)-1, "%s/%s", g_szSourceDir, pDirent->d_name, g_szSourceBakDir);
        GetSrcFileContentAndWriteCtlFile(szSrcFile);   // 获取源文件中的内容, 并写控制文件

        // 处理完成之后, 将文件剪切到备份目录中
        memset(szCommandBuf, 0x00, sizeof(szCommandBuf));
        snprintf(szCommandBuf, sizeof(szCommandBuf)-1, "mv %s %s", szSrcFile, g_szSourceBakDir);
        system(szCommandBuf);
        printf("ReadSrcFileAndWriteCtlFile: now, move %s to %s\n", pDirent->d_name, g_szSourceBakDir);
      }
    }

    closedir(pDir);
    pDir = NULL;

    Sleep(60 * 1000);  // 每1分钟扫描一次
  }
}

/**********************************************************************
* 功能描述: 获取源文件中的内容, 并写控制文件
* 输入参数: pszSrcFileName-带路径的源文件名
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void GetSrcFileContentAndWriteCtlFile(UINT8 *pszSrcFileName)
{
  FILE *fp         = NULL;
  UINT8 szContentLine[1024] = {0};

  T_SrcFileContent tSrcFileContent = {0};

  if (pszSrcFileName == NULL)
  {
    printf("GetSrcFileContentAndWriteCtlFile: pDir is NULL!\n");
    return;
  }

  if ((fp = fopen(pszSrcFileName, "r")) == NULL) // 只读方式打开
  {
    printf("GetSrcFileContentAndWriteCtlFile: open src file failed!\n");
    return;
  }
  else
  {
    while (feof(fp) == 0 && ferror(fp) == 0)
    {
      // 每行对应一条源文件记录
      memset(szContentLine, 0x00, sizeof(szContentLine));
      if (fgets(szContentLine, sizeof(szContentLine), fp) == NULL)
      {
        printf("GetSrcFileContentAndWriteCtlFile: exec fgets to get line null.\n");
      }
      else
      {
        printf("GetSrcFileContentAndWriteCtlFile: get content line: %s\n", szContentLine);
      }

      RemoveLineEnd(szContentLine); // 去掉字符串后面的回车换行符

      if (strlen(szContentLine) == 0)  // 如果为空行, 则继续处理下一条
      {
        printf("GetSrcFileContentAndWriteCtlFile: the length of ContentLine is 0, continue.\n");
        continue;
      }

      GetSrcFileFieldValue(szContentLine, &tSrcFileContent);  // 获取一条记录中各个字段的值

      memset(szContentLine, 0x00, sizeof(szContentLine));
      GetCtlFileContentAndWrite(&tSrcFileContent, szContentLine); // 组装写入控制文件中的内容

      WriteToCtlFile(szContentLine);  // 将内容写到控制文件中
    }

    fclose(fp);
    fp = NULL;
  }
}

/**********************************************************************
* 功能描述: 组装写入控制文件中的内容
* 输入参数: ptSrcFileContent-源文件中一条记录中各个字段的值
* 输出参数: pszContentBuffer-存放内容的缓存
* 返 回 值: 无
* 其它说明: 控制文件中记录为: DataStartTime|DataEndTime|RecordsSum|
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void GetCtlFileContentAndWrite(T_SrcFileContent *ptSrcFileContent, UINT8 *pszContentBuffer)
{
  UINT8 szContentLine[500] = {0};

  if (ptSrcFileContent == NULL || pszContentBuffer == NULL)
  {
    printf("GetCtlFileContentAndWrite: ptSrcFileContent or pszContentBuffer is NULL!\n");
    return;
  }

  // 根据值的大小对g_szDataStartTime进行赋值
  if (strlen(g_szDataStartTime) == 0)  // 当天第一条
  {
    strncpy(g_szDataStartTime, ptSrcFileContent->szDataStartTime, strlen(ptSrcFileContent->szDataStartTime));
  }
  else
  {
    if (strncmp(g_szDataStartTime, ptSrcFileContent->szDataStartTime, strlen(ptSrcFileContent->szDataStartTime)) > 0) // 修改成最小时间
    {
      memset(g_szDataStartTime, 0x00, sizeof(g_szDataStartTime));

      strncpy(g_szDataStartTime, ptSrcFileContent->szDataStartTime, strlen(ptSrcFileContent->szDataStartTime));
    }
  }

  // 根据值的大小对g_szDataEndTime进行赋值
  if (strlen(g_szDataEndTime) == 0)  // 当天第一条
  {
    strncpy(g_szDataEndTime, ptSrcFileContent->szDataEndTime, strlen(ptSrcFileContent->szDataEndTime));
  }
  else
  {
    if (strncmp(g_szDataEndTime, ptSrcFileContent->szDataEndTime, strlen(ptSrcFileContent->szDataEndTime)) < 0) // 修改成最大时间
    {
      memset(g_szDataEndTime, 0x00, sizeof(g_szDataEndTime));

      strncpy(g_szDataEndTime, ptSrcFileContent->szDataEndTime, strlen(ptSrcFileContent->szDataEndTime));
    }
  }

  // 记录总条数加1
  g_iRecordsSum = g_iRecordsSum + 1;   // 当天所有记录的总条数加1

  // 打印三个字段的内容
  printf("GetCtlFileContentAndWrite: DataStartTime is %s, DataEndTime is %s, RecordsSum is %d\n", g_szDataStartTime, g_szDataEndTime, g_iRecordsSum);

  // 组装写到控制文件中的消息内容
  snprintf(szContentLine, sizeof(szContentLine)-1, "%s|%s|%d|", g_szDataStartTime, g_szDataEndTime, g_iRecordsSum);

  printf("GetCtlFileContentAndWrite: ContentLine is %s\n", szContentLine);

  strncpy(pszContentBuffer, szContentLine, strlen(szContentLine));
}

/**********************************************************************
* 功能描述: 获取源文件中的各个字段的值
* 输入参数: pszContentLine-一条记录
* 输出参数: ptSrcFileContent-源文件中一条记录中各个字段的值
* 返 回 值: 无
* 其它说明: 源文件中每条记录的格式为: SrcNumber|DstNumber|DataStartTime|DataEndTime|
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void GetSrcFileFieldValue(UINT8 *pszContentLine, T_SrcFileContent *ptSrcFileContent)
{
  if (pszContentLine == NULL || ptSrcFileContent == NULL)
  {
    printf("GetSrcFileFieldValue: ContentLine or SrcFileContent is NULL!\n");
    return;
  }

  // 获取源号码
  if (TRUE != GetValueFromStr(1, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szSrcNumber, '|', sizeof(ptSrcFileContent->szSrcNumber)))
  {
    printf("GetSrcFileFieldValue: exec GetValueFromStr to get szSrcNumber failed!\n");
    return;
  }

  // 获取目的号码
  if (TRUE != GetValueFromStr(2, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szDstNumber, '|', sizeof(ptSrcFileContent->szDstNumber)))
  {
    printf("GetSrcFileFieldValue: exec GetValueFromStr to get szDstNumber failed!\n");
    return;
  }

  // 获取开始时间
  if (TRUE != GetValueFromStr(3, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szDataStartTime, '|', sizeof(ptSrcFileContent->szDataStartTime)))
  {
    printf("GetSrcFileFieldValue: exec GetValueFromStr to get szDataStartTime failed!\n");
    return;
  }

  // 获取结束时间
  if (TRUE != GetValueFromStr(4, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szDataEndTime, '|', sizeof(ptSrcFileContent->szDataEndTime)))
  {
    printf("GetSrcFileFieldValue: exec GetValueFromStr to get szDataEndTime failed!\n");
    return;
  }

  printf("GetSrcFileFieldValue: SrcNumber=%s, DstNumber=%s, DataStartTime=%s, DataEndTime=%s\n", ptSrcFileContent->szSrcNumber, ptSrcFileContent->szDstNumber,
                                        ptSrcFileContent->szDataStartTime, ptSrcFileContent->szDataEndTime);

}

/**********************************************************************
* 功能描述: 程序休眠
* 输入参数: iCountMs-休眠时间(单位:ms)
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void Sleep(UINT32 iCountMs)
{
  struct timeval t_timeout = {0};

  if (iCountMs < 1000)
  {
    t_timeout.tv_sec = 0;
    t_timeout.tv_usec = iCountMs * 1000;
  }
  else
  {
    t_timeout.tv_sec = iCountMs / 1000;
    t_timeout.tv_usec = (iCountMs % 1000) * 1000;
  }
  select(0, NULL, NULL, NULL, &t_timeout);  // 调用select函数阻塞程序
}

/**********************************************************************
*功能描述:获取字符串中某一个字段的值
*输入参数:iSerialNum-字段编号(为正整数)
      iContentType-需要获取的内容的类型
      pSourceStr-源字符串
      pDstStr-目的字符串(提取的值的存放位置)
      cIsolater-源字符串中字段的分隔符
      iDstStrSize-目的字符串的长度
*输出参数:无
*返 回 值:TRUE-成功 FALSE-失败
*其它说明:无
*修改日期    版本号      修改人     修改内容
* --------------------------------------------------------------
* 20151102    V1.0     Zhou Zhaoxiong    创建
***********************************************************************/
BOOL GetValueFromStr(UINT16 iSerialNum, UINT8 iContentType, UINT8 *pSourceStr, UINT8 *pDstStr, UINT8 cIsolater, UINT32 iDstStrSize)
{
  UINT8 *pStrBegin         = NULL;
  UINT8 *pStrEnd          = NULL;
  UINT8  szRetBuf[MAX_RET_BUF_LEN] = {0};   // 截取出的字符串放入该数组中
  UINT8 *pUINT8          = NULL;
  UINT16 *pUINT16          = NULL;
  UINT32 *pUINT32          = NULL;
  UINT32 iFieldLen         = 0;   // 用于表示每个字段的实际长度

  if (pSourceStr == NULL)           // 对输入指针的异常情况进行判断
  {
    return FALSE;
  }
  //字段首
  pStrBegin = pSourceStr;
  while (--iSerialNum != 0)
  {
    pStrBegin = strchr(pStrBegin, cIsolater);
    if (pStrBegin == NULL)
    {
      return FALSE;
    }
    pStrBegin ++;
  }

  //字段尾
  pStrEnd = strchr(pStrBegin, cIsolater);
  if (pStrEnd == NULL)
  {
    return FALSE;
  }

  iFieldLen = (UINT16)(pStrEnd - pStrBegin);
  if(iFieldLen >= MAX_RET_BUF_LEN) //进行异常保护, 防止每个字段的值过长
  {
    iFieldLen = MAX_RET_BUF_LEN - 1;
  }

  memcpy(szRetBuf, pStrBegin, iFieldLen);

  //将需要的字段值放到pDstStr中去
  switch (iContentType)
  {
    case MML_STR_TYPE:            //字符串类型
    {
      strncpy(pDstStr, szRetBuf, iDstStrSize);
      break;
    }

    case MML_INT8_TYPE:            //字符类型
    {
      pUINT8  = (UINT8 *)pDstStr;
      *pDstStr = (UINT8)atoi(szRetBuf);
      break;
    }

    case MML_INT16_TYPE:           // short int类型
    {
      pUINT16 = (UINT16 *)pDstStr;
      *pUINT16 = (UINT16)atoi(szRetBuf);
      break;
    }

    case MML_INT32_TYPE:           // int类型
    {
      pUINT32 = (UINT32 *)pDstStr;
      *pUINT32 = (UINT32)atoi(szRetBuf);
      break;
    }

    default:                 // 一定要有default分支
    {
      return FALSE;
    }
  }

  return TRUE;
}

/**********************************************************************
* 功能描述: 去掉字符串后面的回车换行符
* 输入参数: pszStr-输入的字符串
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期     版本号    修改人       修改内容
* ------------------------------------------------------------------
* 20151102     V1.0   Zhou Zhaoxiong      创建
********************************************************************/
void RemoveLineEnd(UINT8 *pszStr)
{
  UINT32 iStrLen = 0;

  if (pszStr == NULL)
  {
    printf("RemoveLineEnd: pszStr is NULL!\n");
    return;
  }

  iStrLen = strlen(pszStr);
  while (iStrLen > 0)
  {
    if (pszStr[iStrLen-1] == '\n' || pszStr[iStrLen-1] == '\r')
    {
      pszStr[iStrLen-1] = '\0';
    }
    else
    {
      break;
    }

    iStrLen --;
  }

  return;
}

/**********************************************************************
 * 功能描述: 把内容写到控制文件中
 * 输入参数: pszContentLine-一条文件记录
 * 输出参数: 无
 * 返 回 值: 无
 * 其它说明: 无
 * 修改日期    版本号   修改人      修改内容
 * ------------------------------------------------------
 * 20151103    V1.0   Zhou Zhaoxiong    创建
 ***********************************************************************/
void WriteToCtlFile(UINT8 *pszContentLine)
{
  FILE *fpCtlFile = NULL;

  if (pszContentLine == NULL)
  {
    printf("WriteToCtlFile: pszContentLine is NULL.\n");
    return;
  }

  fpCtlFile = fopen(g_szCtlFileName, "w");
  if (fpCtlFile != NULL)
  {
    fputs(pszContentLine, fpCtlFile);
    fclose(fpCtlFile);
    fpCtlFile = NULL;

    printf("WriteToCtlFile: write ctl file successfully! file=%s, content=%s\n", g_szCtlFileName, pszContentLine);
  }
  else
  {
    printf("WriteToCtlFile: write ctl file failed! file=%s, content=%s\n", g_szCtlFileName, pszContentLine);
  }
}

三、程序编译及运行
将程序代码上传到Linux机器上,并在当前用户的zhouzhaoxiong/zzx/CtlFileCreate/SrcFile目录下上传一些满足命名规范的源文件,然后使用“gcc -g -o CtlFileCreate main.c CtlFileCreate.c”命令对程序进行编译,生成“CtlFileCreate”文件;接着运行“CtlFileCreate”命令,可以看到在当前用户的zhouzhaoxiong/zzx/CtlFileCreate/CtlFile目录下有控制文件生成,在当前用户的zhouzhaoxiong/zzx/CtlFileCreate/SrcFile_bak目录下有源文件的备份文件生成。

查看控制文件内容,里面记录的就是当前所处理的所有文件中的记录总条数及所有记录中的呼叫起始时间最小值和呼叫结束时间最大值。

四、程序说明
第一,为了便于说明,在本程序中,源文件的前缀是“Test_”,控制文件命名为“CtlFile.txt”。在实际的开发中,大家完全可以通过配置项来决定源文件及控制文件的命名规则。

第二,为了防止源文件被重复处理,当某个源文件处理完成之后,会被剪切到备份目录中。这样做也是为了方便之后校对控制文件中的内容。

第三,在读取文件中的第一条记录时,将该条记录中的呼叫起始时间和呼叫结束时间分别存放到两个全局变量中,并按照格式写控制文件;在读取该文件中的其他记录时,首先将该条记录中的呼叫起始时间和呼叫结束时间与全局变量进行比较,确保全局变量中存放的是呼叫起始时间最小值和呼叫结束时间最大值,记录总条数加1,并将新的记录内容写入到控制文件中。

第四,在处理完当前目录下的所有文件之后,程序会休眠一段时间,然后继续扫描目录。在实际的开发中,休眠间隔也是可以配置的。

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • Linux下统计当前文件夹下的文件个数、目录个数

    1) 统计当前文件夹下文件的个数 复制代码 代码如下: ls -l |grep "^-"|wc -l 2) 统计当前文件夹下目录的个数 复制代码 代码如下: ls -l |grep "^d"|wc -l 3) 统计当前文件夹下文件的个数,包括子文件夹里的 复制代码 代码如下: ls -lR|grep "^-"|wc -l 4) 统计文件夹下目录的个数,包括子文件夹里的 复制代码 代码如下: ls -lR|grep "^d"|w

  • linux find下如何统计一个目录下的文件个数以及代码总行数的命令

    今天遇到如题所示问题,网上捣鼓半天,有收获 知道指定后缀名的文件总个数命令:        find . -name "*.html" | wc -l 知道一个目录下代码总行数以及单个文件行数:        find . -name "*.html" | xargs wc -l

  • Linux下控制(统计)文件的生成的C代码实现

    本文分享了Linux下控制(统计)文件的生成的C代码实现案例,供大家参考,具体内容如下 一.需求描述 不定时地在Linux机器下的某目录中放入文件,文件内容中包含了用户号码.起止时间等字段,现要求编写一程序来统计目前该目录中所有文件中的记录总条数及所有记录中的最早起始时间和最晚结束时间. 例如,该目录中有两个文件Test_1.txt和Test_2.txt,其中Test_1.txt文件内容为: 15696192591|15696192592|20151103 120909|20151103 201

  • linux下wc统计文件的个数、行数、字数、字节数等信息方法

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件- 2.命令功能: 统计指定文件中的字节数.字数.行数,并将统计结果显示输出.该命令统计指定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所指定文件的总统计数. 3.命令参数: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能与 -c 标志一起使用. -w 统计字数.一个字被定义为由空白.跳格

  • Linux下.tar.xz文件的解压教程详解

    前言 对于xz这个压缩相信很多人陌生,但xz是绝大数linux默认就带的一个压缩工具,xz格式比7z还要小. 最近在下载某个源码包的时候遇到的这种压缩格式,乘此机会分享一下xz的压缩与解压方法. 安装 如果系统没有xz命令,需要进行安装,安装方法非常简单, 在centos下,直接运行: yum install xz 也可以使用源码包安装: 先下载该工具源码包http://tukaani.org/xz/ 下载后解压进入该目录运行configure生成makefile文件用-prefix指定安装目录

  • Linux下的压缩文件剖析

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了.本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

  • 解决linux下openoffice word文件转PDF中文乱码的问题

    网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报错,但转换后的PDF中是乱码,尝试在jre/lib/fonts/中增加字体,还是不能解决问题,因此可以判断非jre字体问题,是linux系统字体问题. 用vim /etc/fonts/fonts.conf,可以看到系统字体文件在/usr/share/fonts,将windows系统字体文件连接到此目录下 ln -s /usr/local/fonts fonts 然后更新缓存:fc-cache 重启openoffice: /o

  • C语言实现Linux下的socket文件传输实例

    本文实例讲述了C语言实现Linux下的socket文件传输.分享给大家供大家参考.具体如下: server.c如下: //////////////////////////////////// //服务器代码 /////////////////////////////////// //本文件是服务器的代码 #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include &

  • 完美解决linux下U盘文件只读的问题

    1. 在终端运行如下命令 tail -f /var/log/syslog 2. 插入有只读文件系统故障的U盘 3. 观察命令行输出 输出局部如下: Jul  8 16:44:50 cslouis-pc kernel: [15595.155904] FAT: Filesystem error (dev sdb4) Jul  8 16:44:50 cslouis-pc kernel: [15595.155905]    fat_get_cluster: invalid cluster chain (

  • linux下制作ISO文件

    linux下制作ISO文件有几种方法,分别如下: 1,从光盘中制作ISO文件 cp /dev/cdrom 路径/ISO 文件名 例子:cp /dev/cdrom /opt/mycd.iso,也可以用 dd if=/dev/cdrom of=/opt/mycd.iso 2,使用目录文件制作ISO文件 mkisofs -r -o 路径/ISO 文件名 目录文件路径 例子:mkisofs -r -o /opt/mycd.iso /home 制作完ISO文件后,如何挂载呢? mount -o loop

  • 详解Linux下find查找文件命令和grep查找文件命令

    目录 一.find命令 1.按文件名 2.按文件类型查询 3.按照文件大小查找 4.按照文件日期查找 4.1按照创建日期查找 4.2按照修改日期查找 4.3按照访问日期查找 5.按深度查找 5.1查找起始点以下n层的目录,不超过n层 5.2搜距离起始点n层以下的目录(即最少n层) 6.高级查找 6.1-exec 6.2-ok 6.3管道方式 二.grep命令 三.grep和find命令结合使用 linux中一切皆文件的思想是重中之重,那么查找文件是学习Linux必须要掌握的技能. 一.find命

  • Linux下查看压缩文件内容的10种方法(小结)

    通常来说,我们查看归档或压缩文件的内容,需要先进行解压缩,然后再查看,比较麻烦.今天给大家介绍 10 不同方法,能够让你轻松地在未解压缩的情况下查看归档或压缩文件的内容. 从技术上讲,查看归档或压缩文件不提前进行解压是不可能的.本文介绍的方法中会将这些压缩文件在后台一个临时目录 /tmp 中进行解压缩.重启系统后,/tmp 目录的内容将被清空. 在进一步讨论之前,这里先解释一下归档和压缩文件. 归档 是将多个文件或文件夹组合成一个文件的过程.在这种情况下,生成的文件没有被压缩. 压缩 是一种将多

随机推荐