21xrx.com
2024-11-25 06:09:07 Monday
登录
文章检索 我的文章 写文章
如何在c++中判断文件是否被修改
2023-06-29 19:19:12 深夜i     --     --
C++文件判断 文件是否被修改 文件修改时间 C++代码实现 文件监控机制

在C++编程中,有时候我们需要判断一个文件是否被修改过。这个问题在实际工作中是非常常见的,特别是在需要动态读取并处理文件内容的时候更是如此。那么,如何在C++中判断文件是否被修改呢?

一、用时间戳判断

我们可以通过比较文件的更改时间来判断文件是否被修改过。每个文件都有一个时间戳,记录了文件的创建时间、修改时间和访问时间。因此,我们可以获取文件的修改时间戳,然后将其与之前存储的时间戳比较,如果时间戳不同,则说明文件被修改过。

示例代码:


#include <iostream>

#include <fstream>

#include <ctime>

using namespace std;

int main()

{

  int lastModifiedTime = 0; // 存储最后一次修改的时间戳

  const char* fileName = "test.txt"; // 文件名

  while (true)

  {

    // 获取文件信息

    struct stat fileStat;

    if (stat(fileName, &fileStat))

    

      cout << "Failed to get file info: " << fileName << endl;

      return -1;

    

    // 获取文件最后一次修改时间戳

    int modifiedTime = fileStat.st_mtime;

    // 判断文件是否被修改

    if (modifiedTime != lastModifiedTime)

    

      lastModifiedTime = modifiedTime;

      cout << "File has been modified." << endl;

      // 这里可以进行对文件的处理操作

    

    // 最多每秒钟检测一次文件是否被修改

    Sleep(1000);

  }

  return 0;

}

二、用文件校验和判断

除了时间戳,我们还可以通过计算文件的校验和来判断文件是否被修改过。文件校验和是一种数字签名,通过对文件的内容进行哈希计算得到,可以确保文件的完整性。

示例代码:


#include <iostream>

#include <fstream>

#include <openssl/md5.h>

using namespace std;

// 计算文件的MD5值

string getFileMD5(const char* fileName)

{

  ifstream fin(fileName, ios::binary);

  if (!fin)

  

    cout << "Failed to open file: " << fileName << endl;

    return "";

  

  MD5_CTX md5Context;

  MD5_Init(&md5Context);

  char buffer[4096];

  int readSize = 0;

  while (fin.good())

  {

    fin.read(buffer, sizeof(buffer));

    readSize = fin.gcount();

    if (readSize > 0)

    {

      MD5_Update(&md5Context, buffer, readSize);

    }

  }

  unsigned char md5Value[MD5_DIGEST_LENGTH];

  MD5_Final(md5Value, &md5Context);

  char returnValue[MD5_DIGEST_LENGTH * 2 + 1] = { 0 };

  for (int i = 0; i < MD5_DIGEST_LENGTH; i++)

  {

    sprintf_s(returnValue + i * 2, sizeof(returnValue) - i * 2, "%02x", md5Value[i]);

  }

  return returnValue;

}

int main()

{

  string lastMD5 = ""; // 存储最后一次的文件校验和

  const char* fileName = "test.txt"; // 文件名

  while (true)

  {

    // 获取文件的MD5值

    string md5 = getFileMD5(fileName);

    // 判断文件是否被修改

    if (md5 != lastMD5)

    

      lastMD5 = md5;

      cout << "File has been modified." << endl;

      // 这里可以进行对文件的处理操作

    

    // 最多每秒钟检测一次文件是否被修改

    Sleep(1000);

  }

  return 0;

}

通过上述两种方法,我们可以在C++中很方便地判断文件是否被修改过,并及时做出相应处理。当然,这只是基本思路,对于一些高级应用场景,我们可能需要更复杂的代码来实现文件监控和处理操作。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章