如何修改文本文件的“修改日期”属性而不影响使用c ++的内容?

时间:2015-01-30 21:48:54

标签: c++ unit-testing

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

除了尝试将文件复制到临时文件并将其写回原始文件之外,是否知道如何处理此问题?

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

3 个答案:

答案 0 :(得分:2)

由于该问题具有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);
}

答案 1 :(得分:1)

来自代码

如果您需要从代码本身设置if,请在SuperUser网站上查看FredrikMörk的答案(接受的答案):

Using copy command to just change the time and date of a file on Windows OS

FredrikMörk答案的文本副本:

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

来自外部工具

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

Using copy command to just change the time and date of a file on Windows OS

链接的文本副本:

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

copy /b filename.ext +,,

(其中filename.ext是您的文件名)。 + ,,是一个特殊的标志,可以复制告诉它只需更新文件上的日期/时间:

  • 更改文件的时间和日期

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

copy /b Source+,,

逗号表示遗漏了Destination参数。

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

@COPY /B %1+,, %1

即使文件不在当前目录中(在Windows 7上测试),也可以使用。

答案 2 :(得分:-2)

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

// #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();