如何使用 c++ 修改文本文件的 "Date modified" 属性而不影响内容?

How to modify a text file's "Date modified" property without affecting the content using c++?

本文关键字:属性 影响 modified Date c++ 何使用 修改 文本 文件      更新时间:2023-10-16

我正在对我的一种方法进行单元测试。将文件选择到结果向量的方法的一个标准是文件从过去几个小时开始更新。但是,为了确保每次运行测试时都有有效的结果,我需要至少将其中一个文件保持"最新"。

除了尝试将文件复制到临时文件并将其写回原始文件之外,知道如何解决这个问题的任何想法

编辑:我使用的是VS2013 C++,我的操作系统是Windows 7。

由于问题具有 c++ 标记并且您使用的是 Windows,因此您可以使用以下代码打开文件并更改其上次修改的属性:

HANDLE hFile = CreateFile("c:\test.txt", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_FILE_HANDLE)
{
    FILETIME filetime;
    SYSTEMTIME systemfile;
    GetSystemTime(&systemfile);
    SystemTimeToFileTime(&systemfile, &filetime);
    SetFileTime(hFile, NULL, NULL, &filetime);
    CloseFile(hFile);
}

从代码

如果您需要从代码本身设置 if,请参阅 SuperUser 网站上的 Fredrik Mörk 的答案(接受的答案):

使用复制命令只更改Windows操作系统上文件的时间和日期

弗雷德里克·默克回答的文字副本:

如果您想自己编写代码,.NET 提供了File.SetLastAccessTimeFile.SetCreationTimeFile.SetLastWriteTime方法。

从外部工具

如果您需要从外部工具(例如cmd.exe)进行设置,请参阅Gish Domains在SuperUser网站上的答案:

使用复制命令只更改Windows操作系统上文件的时间和日期

链接的文字副本:

如果要使用 windows 触摸文件的日期戳,请在命令提示符下使用以下命令:

copy /b filename.ext +,,

(其中文件名.ext是您的文件名称)。+,是一个特殊的标志,用于复制,告诉它简单地更新文件上的日期/时间:

  • 更改文件的时间和日期

如果要在不修改文件的情况下为文件分配当前时间和日期,请使用以下语法:

copy /b Source+,,

逗号表示省略目标参数。

根据Lumi和Justin的评论进行编辑:将其放在批处理文件中,例如。 touch.cmd

@COPY /B %1+,, %1

即使文件不在当前目录中(在 Windows 7 上测试),这也有效。

要在几乎任何平台上将修改后的日期和时间更新为当前时间:

// #include <stdio.h>
FILE* pFile = fopen("filepath.txt", "ab");
if (pFile)
  fclose(pFile);

或者,作为使用 STL 的单行

// #include <fstream>
std::fstream("filepath.txt", std::ios::out | std::ios::app | std::ios::binary).close();