如何以编程方式设置文件的修改时间?

时间:2010-02-02 15:46:37

标签: c windows file

如何在Windows中以编程方式设置文件的修改时间?

6 个答案:

答案 0 :(得分:13)

来自:http://rosettacode.org/wiki/File/Modification_Time#C

#include <time.h>
#include <utime.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main() {
  struct stat foo;
  time_t mtime;
  struct utimbuf new_times;

  stat(filename, &foo);
  mtime = foo.st_mtime; /* seconds since the epoch */

  new_times.actime = foo.st_atime; /* keep atime unchanged */
  new_times.modtime = time(NULL);    /* set mtime to current time */
  utime(filename, &new_times);

  return 0;
}

答案 1 :(得分:7)

Windows(或标准CRT,无论如何)具有与UNIX相同的utimes系列函数。

struct _utimebuf t;
t.tma = 1265140799;  // party like it's 1999
t.tmm = 1265140799;
_utime(fn, &t);

使用Win32函数,可以使用FILE_BASIC_INFO设置SetFileInformationByHandle

FILE_BASIC_INFO b;
b.CreationTime.QuadPart = 1265140799;
b.LastAccessTime.QuadPart = 1265140799;
b.LastWriteTime.QuadPart = 1265140799;
b.ChangeTime.QuadPart = 1265140799;
b.FileAttributes = GetFileAttributes(fn);
SetFileInformationByHandle(h, FileBasicInfo, &b, sizeof(b));

答案 2 :(得分:2)

SetFileInformationByHandle与FileInformationType一起使用为FILE_BASIC_INFO

答案 3 :(得分:1)

我发现这在Windows SetFileTime()

上很有用

答案 4 :(得分:0)

答案 5 :(得分:0)

这是达尔文的解决方案。 删除了所有安全措施。

#include <sys/stat.h>
#include <sys/time.h>

// params
char *path = "a path to a dir, a file or a symlink";
long int modDate = 1199149200;
bool followLink = false;

// body
struct stat currentTimes;

struct timeval newTimes[2];

stat(path, &currentTimes);

newTimes[0].tv_sec = currentTimes.st_atimespec.tv_sec;
newTimes[0].tv_usec = (__darwin_suseconds_t)0;
newTimes[1].tv_sec = modDate;
newTimes[1].tv_usec = (__darwin_suseconds_t)0;

if (followLnk) {
    utimes(path, (const struct timeval *)&newTimes);
} else {
    lutimes(path, (const struct timeval *)&newTimes);
}