如何检测文件是不是被覆盖?

Posted

技术标签:

【中文标题】如何检测文件是不是被覆盖?【英文标题】:How detect if file was overwrote?,如何检测文件是否被覆盖? 【发布时间】:2010-11-18 18:35:50 【问题描述】:

在我的 C/C++ 程序中,我需要检查我读取的文件是否已被覆盖(其 inode 已更改或添加了一些新行)。如果我现在错了,fstatfstat64 仅在我使用 Linux 而非 Windows 时才有用。有没有通用(适用于复杂操作系统)的方法来做到这一点?还有你能告诉我如何使用 fstat64 吗?

【问题讨论】:

文件操作不是 C++ 级别的函数。我认为您不会找到任何通用的东西,尤其是对于您想要的功能。 您可以生成文件的哈希值。要检查它是否已更改,请重新散列文件并进行比较。可能不是你想要的。但是对文件系统状态的操作取决于正在使用的文件系统(这甚至不是特定于操作系统的,因为某些操作系统可以使用多个不同的文件系统)。 【参考方案1】:

您可以跟踪文件的最后写入时间,以了解它是否已被修改。跨平台解决方案使用 boost::filesystem。 Windows 没有 fstat64 AFAIK。

http://www.boost.org/doc/libs/1_44_0/libs/filesystem/v2/doc/index.htm

http://rosettacode.org/wiki/File_modification_time#C.2B.2B

#include <boost/filesystem/operations.hpp>
#include <ctime>
#include <iostream>

int main( int argc , char *argv[ ] ) 
   if ( argc != 2 ) 
      std::cerr << "Error! Syntax: moditime <filename>!\n" ;
      return 1 ;
   
   boost::filesystem::path p( argv[ 1 ] ) ;
   if ( boost::filesystem::exists( p ) ) 
      std::time_t t = boost::filesystem::last_write_time( p ) ;
      std::cout << "On " << std::ctime( &t ) << " the file " << argv[ 1 ] 
     << " was modified the last time!\n" ;
      std::cout << "Setting the modification time to now:\n" ;
      std::time_t n = std::time( 0 ) ;
      boost::filesystem::last_write_time( p , n ) ; 
      t = boost::filesystem::last_write_time( p ) ;
      std::cout << "Now the modification time is " << std::ctime( &t ) << std::endl ;
      return 0 ;
   else 
      std::cout << "Could not find file " << argv[ 1 ] << '\n' ;
      return 2 ;
  

【讨论】:

【参考方案2】:

我没有给你的代码示例,但你能对照你第一次打开文件时检查文件的最后修改时间吗?

编辑

找到了一个相当不错的 sn-p 似乎可以解决问题

http://www.jb.man.ac.uk/~slowe/cpp/lastmod.html

【讨论】:

以上是关于如何检测文件是不是被覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows中检测控件是不是是输入控件并覆盖输入

如何检测 Angular CLI 以报告所有源文件的覆盖率

如何:获取代码覆盖率数据

使用 inotify 检查监视文件夹中的文件是不是被覆盖

Java:如何查找一个方法是不是被基类覆盖? [复制]

请问电脑上经常讲的覆盖是什么意思?我下了个软件,提示说已下过是不是覆盖?