日志源代码,删除指定路径所有文件夹名,并创建新的日志文件

11 篇文章 0 订阅
#include "stdafx.h"
#pragma warning( disable : 4786) // Disable warning messages
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <windows.h>
#include "shlwapi.h"
#include "PComm.h"
#include "CommTools.h"
#include <Shlwapi.h> 
#include <fstream.h>
#include <iostream>
#include <vector>
using namespace std;

/*****************************************************************************
 * 函 数 名  : GetCurrentDirFileFolder
 * 负 责 人  : guoyoung 1110930
 * 创建日期  : 2016年10月21日
 * 函数功能  : 获取给定路径下的所有文件夹名
 * 输入参数  : string path            指定的路径   
 * 输出参数  : vector<string>& files  当前路径下的文件夹名
 * 返 回 值  : int
*****************************************************************************/
static int GetCurrentDirFileFolder(string path, vector<string>& files)
{
    long hFile = 0;
    struct _finddata_t fileinfo;
    string p;
    hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo);
    if (-1 != hFile)
    {
        do
        {
            if (fileinfo.attrib & _A_SUBDIR)
            {
                if ((0 != strcmp(fileinfo.name, "."))
                    && (0 != strcmp(fileinfo.name, "..")))
                {
                    files.push_back(fileinfo.name);
                }
            }
        }while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
    return 0;
}


//创建日志文件和删除N个月前的日志文件夹。
void CLogfile::CreateFileOrDeleteFile(char *LogFile, struct tm **tim, FILE **fp)
{
 long i=0;
 char SubDirName[MAX_NAME] = {0};
    char tmpStr[MAX_NAME] = {0};
 char logPath[MAX_PATH];
    char DateDirName[MAX_NAME] = {0};
    vector<string> files;
    vector<string> Dayfiles;
    int size = 0;
    unsigned int ThrdValue = 0;
    unsigned int TargetValue = 0;
    char YearMonthFileName[12] = {0};
    char YearMonthfilePath[MAX_NAME] = {0};
    char DayfilePath[MAX_NAME] = {0};
   
 memset(SubDirName, 0x0, sizeof(SubDirName));
 memset(tmpStr, 0x0, sizeof(tmpStr));
 memset(logPath, 0x0, sizeof(logPath));
 //strcpy(logPath, "C:\\GWI_log");
 strcpy(logPath, g_logRootDir);
 time(&i);
 *tim=localtime(&i);
 strcpy(SubDirName, logPath);
    if (!FolderExist(SubDirName))
    {
     CreateDirectory(SubDirName, NULL);
    }
   
 sprintf(SubDirName,"%s\\%04d%02d", logPath, (*tim)->tm_year+1900, (*tim)->tm_mon+1);
 if (!FolderExist(SubDirName)) //if (!PathFileExists(SubDirName))
 {
        //按照年月时间删除历史日志文件
        if((*tim)->tm_mon < g_loglastmonthnum)
  {
            sprintf(YearMonthFileName,"%04d%02d", (*tim)->tm_year+1900-1, (*tim)->tm_mon+1-g_loglastmonthnum+12);
  }
  else
  {
            sprintf(YearMonthFileName,"%04d%02d", (*tim)->tm_year+1900, (*tim)->tm_mon+1-g_loglastmonthnum);
  }
  //modify by guoyong 1110930 2016-09-19, when log file last month is 0, it means the log file is not removed permanently.
  if (0 != g_loglastmonthnum)
  {
            ThrdValue = strtoul(YearMonthFileName, '\0', 10);
           
            /* 获取日志路径下 C:\GWI_log\所有年月文件夹, 如文件夹201604 */
            GetCurrentDirFileFolder(logPath, files);
            size = files.size();
            for (int i = 0; i < size; i++)
            {
                const char *CurrentFileName = files[i].c_str();
                TargetValue = strtoul(CurrentFileName,'\0', 10);
                if ((TargetValue != 0)
                    && (TargetValue <= ThrdValue))
                {
                    strcpy(YearMonthfilePath, logPath);
                    strcat(YearMonthfilePath, "\\");
                    strcat(YearMonthfilePath, CurrentFileName);
                    strcpy(tmpStr, YearMonthfilePath);
                   
                    /* 获取日志路径下 C:\GWI_log\201604\所有日期文件夹 */
                    GetCurrentDirFileFolder(YearMonthfilePath, Dayfiles);
                    int iDaysize = Dayfiles.size();
                    for (int j = 0; j < iDaysize; j++)
                    {
                        const char *DayFileName = Dayfiles[j].c_str();
                        strcpy(DayfilePath, YearMonthfilePath);
                        strcat(DayfilePath, "\\");
                        strcat(DayfilePath, DayFileName);
                       
                        DeleteDirectory(DayfilePath);
                        memset(DayfilePath, 0x0, sizeof(DayfilePath));
                    }
                    DeleteDirectory(tmpStr);
                    memset(YearMonthfilePath, 0x0, sizeof(YearMonthfilePath));
                    memset(tmpStr, 0x0, sizeof(tmpStr));
                }  
            }  
  }
       
  CreateDirectory(SubDirName, NULL);
 }
    sprintf(DateDirName,"%s\\%04d%02d\\%2d", logPath, (*tim)->tm_year+1900, (*tim)->tm_mon+1, (*tim)->tm_mday);
    if (!FolderExist(DateDirName))
    {
        CreateDirectory(DateDirName, NULL);
    }
   
 memset(m_filename, 0x0, sizeof(m_filename));
 char *pp = strrchr(LogFile, '\\');
 if( pp )
 {
  sprintf(m_filename, "%s\\%s_%04d%02d%02d.log", DateDirName, pp+1, (*tim)->tm_year+1900, (*tim)->tm_mon+1, (*tim)->tm_mday);
 }
 else
 {
  sprintf(m_filename, "%s\\%s_%04d%02d%02d.log", DateDirName, LogFile, (*tim)->tm_year+1900, (*tim)->tm_mon+1, (*tim)->tm_mday);
 }
 *fp=fopen(m_filename, "at");
}
在VBA (Visual Basic for Applications) 中,你可以编写宏来批量复制文件夹并修改文件。这通常涉及到`Shell`函数来执行系统级别的操作以及一些字符串处理。以下是一个简单的示例代码片段,它演示了如何复制文件夹并按指定模式更改文件: ```vba Sub CopyAndRenameFiles() Dim sourceFolder As String Dim targetFolder As String Dim filePattern As String Dim fileName As String Dim newFileName As String ' 设置源文件夹、目标文件夹文件模式 sourceFolder = "C:\SourceFolder\" '<-- 需要替换为你源文件夹路径 targetFolder = "C:\TargetFolder\" '<-- 需要替换为你目标文件夹路径 filePattern = "*.txt" '<-- 想要修改称的文件后缀 ' 循环遍历源文件夹中的所有匹配文件 For Each fileName In Dir(sourceFolder & filePattern) ' 构建文件(例如:原_副本) newFileName = Replace(fileName, ".txt", "_副本.txt") '<-- 这里修改文件后缀和添加副本字样 ' 使用Shell命令复制文件并改 Shell "xcopy """ & sourceFolder & fileName & """ """"" & targetFolder & newFileName & """ /Y", vbNormalFocus '<-- "/Y"表示覆盖无提示 ' 如果需要,这里可以添加日志记录或其他处理操作 Debug.Print "Copied and renamed file: " & fileName & " to " & newFileName Next fileName End Sub ``` **注意:** 1. 将上述代码中的`sourceFolder`, `targetFolder`, 和 `filePattern` 替换为你实际的文件夹路径文件模式。 2. `Shell` 函数可能会有权限限制,如果运行时遇到权限问题,可能需要以管理员身份运行Excel。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值