【问题标题】:Find the oldest file within a directory in C on Windows在 Windows 上的 C 目录中查找最旧的文件
【发布时间】:2012-10-06 15:07:03
【问题描述】:

我正在处理一个 C 项目,我试图在一个目录中找到最旧的文件,以便一旦找到最旧的文件,它就会被删除。我找不到任何关于如何在 C 中使用 windows 执行此操作的信息,已经找到在 Linux 中执行此操作的方法,但我需要一个适用于 Windows 的版本。

【问题讨论】:

标签: c windows file io directory


【解决方案1】:

基本上你扫描目录,就像在 Linux 中一样(但你也可以查看 Boost 库)。

关于时间和日期的数据已经在directory scan structure中提供

HANDLE fh;

FILETIME oldest = {-1U, -1U};

// Buffer to hold file name
oldestFile = malloc(MAX_PATH);

fd = malloc(sizeof(WIN32_FIND_DATA));
if (INVALID_HANDLE_VALUE == (fh = FindFirstFile(directory_name, fd)))
    // Signal error, free memory, (and return an error code?)

// OK to proceed
do
{
    if(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        continue;
    // 
    if ((fd->ftCreationTime.dwHighDateTime < oldest.dwHighDateTime)
    || (fd->ftCreationTime.dwHighDateTime == oldest.dwHighDateTime
      && fd->ftCreationTime.dwLowDateTime < oldest.dwLowDateTime))
    {
        oldest.dwHighDateTime = fd->ftCreationTime.dwHighDateTime; // ftLastAccessTime? ftLastWriteTime?
        oldest.dwLowDateTime = fd ->ft CreationTime.dwLowDateTime;
        strncpy(oldestFile, MAX_PATH, fd->cFileName);
    }
} while(FindNextFile(fh, fd));
FindClose(fh);
free(fd); fd = NULL;

【讨论】:

  • 不知道,也许值得将其包装在 extern "C" C++ char *find_oldest_file(char *directory) 函数中...
【解决方案2】:

您需要在 Windows 上使用 FindFirstFile/FindNextFile 组合来获取目录中的文件。然后,您可以像在 Linux 中一样使用 stat,也可以使用 GetFileAttributesEx 检查日期。

【讨论】:

  • 无需单独调用,FindFirstFile/FindNextFile返回的信息中已经包含文件时间戳。
【解决方案3】:

由于 windows 与 POSIX 兼容,您应该能够读取目录并对文件执行 stat()

【讨论】:

  • 我不知道你在想什么窗口,但不是我使用的窗口。
  • 我不认为它是 POSIX-ness,但 Windows 确实有 stat
  • @Wug 搜索opendir(), readdir(), stat()technet.microsoft.com/en-us/library/bb463219.aspx
  • 这里有一个微妙的技术点。我相信 Windows 确实在某个阶段通过了 POSIX 认证。但是,这仅适用于在 Interix(UNIX 服务)子系统中运行的应用程序,不适用于 Win32 应用程序。请特别注意,Visual Studio 运行时库不提供 stat,尽管它提供了 _stat。 _stat 虽然显然基于 stat,但不能保证符合 POSIX。
  • @HarryJohnston 感谢您的澄清。几年前我就读过它。
【解决方案4】:

您可以使用GetFileAttributesEx() 函数填充具有三个时间相关成员的WIN32_FILE_ATTRIBUTE_DATA struct

  • ftCreationTime
  • ftLastAccessTime
  • ftLastWriteTime

您可以比较其中哪个更相关,并跟踪在迭代期间找到的最旧文件。迭代结束后,使用DeleteFile() 将其删除。时间成员的类型为FILETIME,可以使用CompareFileTime()进行比较。


或者使用GetFileTime()获取相关时间属性,如BeyondSora所注释。

【讨论】:

    【解决方案5】:

    要在 Windows 中查找文件的详细信息,您必须参考文件分配表,其中包含有关文件的所有详细信息。 检查here的编码部分以读取FAT

    【讨论】:

    • 如果磁盘使用不同的文件系统?
    • @harald 但是 NTFS/FAT 都有一些存储文件详细信息的文件表。 FAT 的文件表包含的详细信息较少且不支持安全性,但 NTFS 的文件表比 FAT 具有更高的安全性。
    • 关键是你不知道你的程序最终要读取什么文件系统,即使你知道了——你可能无法在那个级别访问它。如果它是挂载的 NFS 卷怎么办?还是通过 sftp 挂载的远程目录?使用操作系统或运行时库 API 每次都会给你正确的答案。直接从磁盘读取内部文件系统结构可能很有趣,但不是解决这个问题的明智方法。
    猜你喜欢
    • 2010-10-24
    • 2023-04-09
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2012-04-23
    • 2021-01-12
    • 2021-06-24
    • 2012-06-12
    相关资源
    最近更新 更多