首页 > 其他分享 >11.8 实现重置文件时间戳

11.8 实现重置文件时间戳

时间:2023-11-20 09:13:35浏览次数:25  
标签:文件 路径 11.8 函数 重置 FILETIME char 时间

11.8.1 切割文件名与路径

如下代码是一段文件路径切割实现,通过传入文件路径,获取文件名和文件路径的功能。具体实现包括两个函数:GetFileNameGetFilePath。前者接收一个文件路径字符串,并返回该文件路径中的文件名;后者接收一个文件路径字符串,并返回该文件路径中除文件名以外的部分,即文件路径。

main函数中,首先定义了两个文件路径字符串szPathAszPathB。然后,分别调用GetFileNameGetFilePath函数,将它们的返回值保存在指针变量ptr中,并输出到控制台上。最后,程序返回0,结束执行。

#include <iostream>
#include <Windows.h>
#include <string.h>

// 传入路径得到文件名
char* GetFileName(char* Path)
{
    if (strchr(Path, '\\'))
    {
        char ch = '\\';
        char* ref = strrchr(Path, ch) + 1;
        return ref;
    }
    else
    {
        char ch = '/';
        char* ref = strrchr(Path, ch) + 1;
        return ref;
    }
}

// 传入路径只得到文件路径
char* GetFilePath(char *Path)
{
    int i, pos;
    for (int count = 0; count < strlen(Path); count++)
    {
        if (Path[count] == '\\' || Path[count] == '/')
        {
            pos = count;
        }
    }
    Path[pos] = '\0';
    return Path;
}

int main(int argc,char *argv[])
{
    char szPathA[128] = "C://Windows/LanguageOverlayCache/server.cpp";
    char szPathB[128] = "c:\\Windows\\LanguageOverlayCache\\kernel.dll";
    char* ptr = NULL;

    ptr = GetFileName(szPathA);
    std::cout << "文件名A: " << ptr << std::endl;

    ptr = GetFileName(szPathB);
    std::cout << "文件名B: " << ptr << std::endl;

    ptr = GetFilePath(szPathB);
    std::cout << "文件路径: " << ptr << std::endl;

    return 0;
}

传入一个完整文件路径,并自动分割;

11.8.2 遍历目录下文件

如下代码是一个使用递归遍历目录,并输出指定格式的文件信息的程序。主要用到了文件操作函数findfirst()_findnext()_findclose(),以及结构体类型_finddata_t

findfirst函数是Windows平台上用于查找文件的函数之一,它属于 C Runtime Library(CRT)中的一部分,提供了一种在指定目录中搜索文件的机制。

定义:

intptr_t _findfirst(
    const char *filespec,
    struct _finddata_t *fileinfo
);

参数:

  • filespec:指定要搜索的文件规范(通配符模式),可以包含路径信息。
  • fileinfo:指向 finddata_t 结构的指针,用于存储找到的文件信息。

返回值:

  • 如果成功,返回一个查找句柄(handle);如果失败,返回 -1。

findnext函数是Windows平台上用于查找文件的函数之一,它通常与_findfirst配合使用,用于获取指定目录中的下一个文件。

定义:

int _findnext(
    intptr_t handle,
    struct _finddata_t *fileinfo
);

参数:

  • handle:由findfirst返回的查找句柄。
  • fileinfo:指向finddata_t结构的指针,用于存储找到的下一个文件的信息。

返回值:

  • 如果成功,返回 0;如果失败或到达目录尾部,返回 -1。

函数dfsFolder()分别接收目录路径和需要查找的文件格式。通过使用_findfirst()找到该路径下的第一个文件或文件夹,如果是文件夹,则递归调用dfsFolder()函数,如果是文件,则判断其是否为需要查找的格式,如果是则输出该文件的相关信息。

函数dfsFolderAll()只传入了一个参数,即目录路径。该函数使用了和dfsFolder()类似的方法,但是不判断文件格式,而是将该路径下的所有文件和文件夹都列出来,在main()函数中,可以通过调用这两个函数来实现列出目录下所有文件和文件夹,或是列出目录下所有指定格式的文件。

#include <io.h>
#include <iostream>

using namespace std;

// 列举出所有文件路径
void dfsFolderAll(string folderPath)
{
    _finddata_t file;
    int k;
    long HANDLE;
    k = HANDLE = _findfirst(folderPath.c_str(), &file);
    while (k != -1)
    {
        cout << file.name << endl;
        k = _findnext(HANDLE, &file);
    }
    _findclose(HANDLE);
}

// 传入目录与需要列出的指定格式文件
void dfsFolder(string folderPath,string subpath)
{
    _finddata_t FileInfo;
    /*  文件信息结构体
    struct _finddata_t{
         unsigned attrib;     // 文件属性
         time_t time_create;    // 创建时的时间戳
         time_t time_access;    // 最后一次被访问时的时间戳
         time_t time_write;     // 最后一次被修改时的时间戳
         _fsize_t size;       // 文件字节大小
         char name[_MAX_FNAME];   // 文件名
    };*/
    string strfind = folderPath + "\\*";
    long Handle = _findfirst(strfind.c_str(), &FileInfo);

    if (Handle == -1L)
    {
        exit(0);
    }
    do
    {
        // 判断是否为目录 
        if (FileInfo.attrib & _A_SUBDIR)
        {
            // 判断目录是否为当前目录和上一级目录
            if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
            {
                // 如果不是则拼接当前路径继续递归调用
                string newPath = folderPath + "\\" + FileInfo.name;
                dfsFolder(newPath,subpath.c_str());
            }
        }
        else
        {
            // 判断是不是指定后缀的文件
            if (strstr(FileInfo.name, subpath.c_str()))
            {
                cout << " 文件名: " << FileInfo.name << " 文件大小: " << FileInfo.size;
        if (FileInfo.attrib == _A_NORMAL)
        {
                    cout << " 普通文件 " << endl;
        }
        else if (FileInfo.attrib == _A_RDONLY)
        {
          cout << " 只读文件 " << endl;
        }
        else if (FileInfo.attrib == _A_HIDDEN)
        {
          cout << " 隐藏文件 " << endl;
        }
        else if (FileInfo.attrib == _A_SYSTEM)
        {
          cout << " 系统文件 " << endl;
        }
        else if (FileInfo.attrib == _A_SUBDIR)
        {
          cout << " 子目录 " << endl;
        }
        else
        {
          cout << " 存档文件 " << endl;
        }
            }
        }
    } while (_findnext(Handle, &FileInfo) == 0);
    _findclose(Handle);
}

int main(int argc,char *argv[])
{
    //dfsFolder("C:\\Windows\\system32",".dll");
    dfsFolderAll("C:\\Windows\\system32\\*");

    return 0;
}

运行后输出所有C:\\Windows\\system32\\*目录下的文件;

11.8.3 重置文件目录时间戳

文件目录时间戳是指与文件或目录相关联的时间信息,通常包括三个主要的时间戳:

  • 创建时间(Creation Time): 表示文件或目录被创建的时间。这个时间戳记录了文件或目录在文件系统中第一次被创建的时间点。
  • 最后访问时间(Last Access Time): 表示文件或目录最后一次被访问的时间。每当文件或目录被打开、读取、执行等操作时,最后访问时间都会更新。
  • 最后修改时间(Last Write Time): 表示文件或目录最后一次被修改的时间。当文件内容发生变化、文件被写入时,最后修改时间会更新。

这些时间戳提供了关于文件或目录的重要信息,对于文件管理和调查文件活动非常有用。在Windows和许多其他操作系统中,这些时间戳通常以 FILETIME 结构体的形式存储,该结构体表示从1601年1月1日午夜开始计算的100纳秒间隔数。

这些时间戳可以通过文件系统或相关的系统调用函数(如 GetFileTime、SetFileTime)来访问和修改。

SystemTimeToFileTime 用于将SYSTEMTIME结构体表示的时间转换为FILETIME结构体表示的时间。

函数签名:

BOOL SystemTimeToFileTime(
  const SYSTEMTIME *lpSystemTime,
  LPFILETIME       lpFileTime
);

参数:

  • lpSystemTime:指向 SYSTEMTIME 结构体的指针,表示待转换的系统时间。
  • lpFileTime:指向 FILETIME 结构体的指针,用于存储转换后的文件时间。

返回值:

  • 如果函数成功,返回非零值;如果函数失败,返回零。可以通过调用 GetLastError 函数获取更多信息。

LocalFileTimeToFileTime 用于将本地时间(FILETIME 结构体表示)转换为协调世界时(UTC)时间(同样是 FILETIME 结构体表示)。

函数签名:

BOOL LocalFileTimeToFileTime(
  const FILETIME *lpLocalFileTime,
  LPFILETIME     lpFileTime
);

参数:

  • lpLocalFileTime:指向 FILETIME 结构体的指针,表示待转换的本地时间。
  • lpFileTime:指向 FILETIME 结构体的指针,用于存储转换后的 UTC 时间。

返回值:

  • 如果函数成功,返回非零值;如果函数失败,返回零。可以通过调用 GetLastError 函数获取更多信息。

SetFileTime 用于设置指定文件的创建时间、访问时间和修改时间。

函数签名:

BOOL SetFileTime(
  HANDLE      hFile,
  const FILETIME *lpCreationTime,
  const FILETIME *lpLastAccessTime,
  const FILETIME *lpLastWriteTime
);

参数:

  • hFile:要设置时间信息的文件的句柄。
  • lpCreationTime:指向 FILETIME 结构体的指针,表示文件的创建时间。
  • lpLastAccessTime:指向 FILETIME 结构体的指针,表示文件的最后访问时间。
  • lpLastWriteTime:指向 FILETIME 结构体的指针,表示文件的最后修改时间。

返回值:

  • 如果函数成功,返回非零值;如果函数失败,返回零。可以通过调用 GetLastError 函数获取更多信息。
#include <io.h>
#include <iostream>
#include <windows.h>

using namespace std;

// 修改文件当前创建日期
bool SetLocalFileTime(const char* FilePath, const char* Date, const char* Time)
{
    HANDLE hFile = CreateFileA(FilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    SYSTEMTIME spec_time;
    sscanf(Date, "%d-%d-%d", &spec_time.wYear, &spec_time.wMonth, &spec_time.wDay);
    sscanf(Time, "%d:%d:%d", &spec_time.wHour, &spec_time.wMinute, &spec_time.wSecond);

    FILETIME ft, LocalFileTime;
    SystemTimeToFileTime(&spec_time, &ft);
    LocalFileTimeToFileTime(&ft, &LocalFileTime);

    if (SetFileTime(hFile,
        &LocalFileTime,    // 创建时间
        &LocalFileTime,    // 访问时间
        &LocalFileTime     // 修改时间
        ))
    {
        CloseHandle(hFile);
        return true;
    }
    CloseHandle(hFile);
    return false;
}

// 批量修改文件名
void BatchSetFileDateTime(string folderPath, string Date, string Time)
{
    _finddata_t FileInfo;
    string strfind = folderPath + "\\*";
    long Handle = _findfirst(strfind.c_str(), &FileInfo);

    if (Handle == NULL)
    {
        exit(0);
    }
    do
    {
        // 判断是否为目录 
        if (FileInfo.attrib & _A_SUBDIR)
        {
            // 判断目录是否为当前目录和上一级目录
            if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
            {
                // 如果不是则拼接当前路径继续递归调用
                string newPath = folderPath + "\\" + FileInfo.name;
                bool ref = SetLocalFileTime(newPath.c_str(), Date.c_str(), Time.c_str());
                if (ref == true)
                {
                    std::cout << "[*] 目录: " << newPath.c_str() << std::endl;
                }
                BatchSetFileDateTime(newPath, Date, Time);
            }
        }
        else
        {
            string newPath = folderPath + "\\" + FileInfo.name;
            bool ref = SetLocalFileTime(newPath.c_str(), "1995-01-01", "12:00:00");
            if (ref == true)
            {
                std::cout << "[*] 文件: " << newPath.c_str() << std::endl;
            }
        }

    } while (_findnext(Handle, &FileInfo) == 0);
    _findclose(Handle);
}

int main(int argc, char* argv[])
{
    BatchSetFileDateTime("D:\\lyshark", "1995-01-01", "0:0:0");

    system("pause");
    return 0;
}

运行后,目录下的文件将被重置时间戳;

标签:文件,路径,11.8,函数,重置,FILETIME,char,时间
From: https://www.cnblogs.com/LyShark/p/17841958.html

相关文章

  • Java实现压缩文件浅谈
    背景:在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作。主要涉及的类有ZipOutputStream、ZipEntry、ZipInputStream和InflaterInputStream。压缩文件的步骤和原理:创建一个FileOutputStream对象,用于将压缩后的数据写入到文件中。创建一个BufferedOutp......
  • 如何修改文件的创建时间&修改时间、如何修改.jpg文件的属性拍摄日期中的时分秒
    一、如何修改文件的创建时间&修改时间参考文章:https://sysin.org/blog/how-to-change-file-date/推荐使用以下linux命令直接进行修改: //修改1.jpg文件的修改时间为"2023-10-3010:03:38"touch--time=mtime-d"2023-10-3010:03:38"1.jpg//修改1.jpg文件的创建时间为"202......
  • 网络文件共享服务
    网络文件共享服务存储类型DASNASSANftp应用级NFS内核级1.FTPFTP文件传输协议ftp工作原理安装yuminstall-yftpwindows自带ftp功能两种模式主动模式客户端的端口号是随机的,服务端主动开启20端口被动模式客户端和服务端的端口号都是随机的端口号ftp......
  • 8.1 Windows驱动开发:内核文件读写系列函数
    在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头即可在内核中使用,例如本章要讲解的文件与目录操作相关函数,多数ARK反内核工具都具有对......
  • Dynamic CRM 组织服务对Word模版生成PDF文件
    目的:解决用户手动下载word模版再上传问题解决方案:组织服务直接对指定的word模版文件生成PDF文件流1.word模版必须上传到系统文档模版后:设置->模版->文档模版 2.组织调用“ExportpdfDocument”,返回PDF文件字节信息。另外实体信息需要把“注释”勾选上,否则执行代码会报错,如下:......
  • vim配置(编辑~/.vimrc文件)
    主要配置如下setnumbersetnocompatiblesyntaxonsetshowmodesetencoding=utf-8filetypeindentonsetautoindentsettabstop=4setshiftwidth=4setexpandtabsetshowmatchsethlsearchsetincsearchsetsmartcasesetnobackupsetnoswapfilesetnoundofile......
  • 10.静态文件
    静态文件静态文件(staticfiles)和模板概念相反,指的是内容不需要动态生成的文件,比如图片、CSS文件和JavaScript脚本等。在Flask中,需要创建一个static目录来保存静态文件,它应该和程序模块、templates在同一目录层级。生成静态文件URL在HTML文件里,引入这些静态文件需要......
  • 【5.0】Python中级之文件操作
    【一】文本处理引入应用程序运行过程中产生的数据最先都是存放于内存中的若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统......
  • 文件管理
    1.了解目录结构 1.1文件目录 文件目录是指在计算机操作系统中用于组织和存储文件的一种结构化方式。它是由文件夹(也称为目录)和文件组成的层次结构。在Linux系统中,文件目录采用了树形结构,由根目录(/)开始,每个目录下可以包含子目录和文件。常见的文件目录结构如下:/:根目录,是整......
  • Qt项目中CMakeLists.txt文件
    cmake_minimum_required(VERSION3.5)project(testNameLANGUAGESCXX)set(CMAKE_AUTOUICON)set(CMAKE_AUTOMOCON)set(CMAKE_AUTORCCON)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDON)find_package(Qt5COMPONENTSREQUIREDWidgetsSqlCharts......