如何修改文本文件的 "Date modified" 属性 而不影响使用 C++ 的内容?
How to modify a text file's "Date modified" property without affecting the content using c++?
我正在对我的一种方法进行单元测试。 select 将文件 select 放入结果向量的方法的一个标准是文件是最近几个小时的更新。
但是,为了确保每当我 运行 测试时都有有效结果,我需要至少保留一个文件 "up to date"。
除了尝试将文件复制到临时文件并将其写回原始文件外,是否知道如何解决此问题?
编辑:
我正在使用 VS2013 C++,我的 OS 是 windows 7.
来自代码
如果您需要从代码本身设置 if,请参阅 SuperUser 网站上 Fredrik Mörk 的回答(已接受的回答):
Using copy command to just change the time and date of a file on Windows OS
Fredrik Mörk 回答的文本副本:
如果您想自己编写代码,.NET 提供了 File.SetLastAccessTime
、File.SetCreationTime
和 File.SetLastWriteTime
方法。
来自外部工具
如果您需要从外部工具设置它,例如 cmd.exe,请参阅 SuperUser 站点上 Gish Domains 的回答:
Using copy command to just change the time and date of a file on Windows OS
link 的文本副本:
如果要使用 windows 修改文件的日期戳,请在命令提示符下使用以下命令:
copy /b filename.ext +,,
(其中 filename.ext 是您的文件名)。 +, 是要复制的特殊标志,告诉它只需更新文件上的 date/time:
- 更改文件的时间和日期
如果要在不修改文件的情况下将当前时间和日期分配给文件,请使用以下语法:
copy /b Source+,,
逗号表示省略了 Destination 参数。
根据 Lumi 和 Justin 的评论进行编辑:将其放入批处理文件中,例如。 touch.cmd
@COPY /B %1+,, %1
即使文件不在当前目录中也能正常工作(在 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);
}
要在任何平台上将修改后的日期和时间更新为当前时间:
// #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();
我正在对我的一种方法进行单元测试。 select 将文件 select 放入结果向量的方法的一个标准是文件是最近几个小时的更新。 但是,为了确保每当我 运行 测试时都有有效结果,我需要至少保留一个文件 "up to date"。
除了尝试将文件复制到临时文件并将其写回原始文件外,是否知道如何解决此问题?
编辑: 我正在使用 VS2013 C++,我的 OS 是 windows 7.
来自代码
如果您需要从代码本身设置 if,请参阅 SuperUser 网站上 Fredrik Mörk 的回答(已接受的回答):
Using copy command to just change the time and date of a file on Windows OS
Fredrik Mörk 回答的文本副本:
如果您想自己编写代码,.NET 提供了 File.SetLastAccessTime
、File.SetCreationTime
和 File.SetLastWriteTime
方法。
来自外部工具
如果您需要从外部工具设置它,例如 cmd.exe,请参阅 SuperUser 站点上 Gish Domains 的回答:
Using copy command to just change the time and date of a file on Windows OS
link 的文本副本:
如果要使用 windows 修改文件的日期戳,请在命令提示符下使用以下命令:
copy /b filename.ext +,,
(其中 filename.ext 是您的文件名)。 +, 是要复制的特殊标志,告诉它只需更新文件上的 date/time:
- 更改文件的时间和日期
如果要在不修改文件的情况下将当前时间和日期分配给文件,请使用以下语法:
copy /b Source+,,
逗号表示省略了 Destination 参数。
根据 Lumi 和 Justin 的评论进行编辑:将其放入批处理文件中,例如。 touch.cmd
@COPY /B %1+,, %1
即使文件不在当前目录中也能正常工作(在 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);
}
要在任何平台上将修改后的日期和时间更新为当前时间:
// #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();