如何读取目录中上次修改的文件的文件名

How to read filename of the last modified file in a directory?

本文关键字:修改 文件 文件名 何读取 读取      更新时间:2023-10-16

我有一个目录,其中包含一些不同类型的扩展名文件。其中,有.grb2文件(气象数据)。例如:

20140729_0000_000.grb2

20140729_1200_000.grb2

20140730_1200_000.grb2

问题是我想C++仅读取此类型的最后修改文件(.grb2)。由于它们是按日期命名的,因此读取文件名中数字最大的文件也是有效的,因为这是最新的气象数据。我目前正在手动读取它(直接在C++中输入其文件名),这显然不是最佳的,因为我下载了很多这些文件。

你知道吗?顺便说一句,我正在Windows中工作(如果有任何帮助的话)。

您可以考虑使用 Boost 文件系统。Boost 文件系统为此实现了即将推出的标准库规范。

您可以使用它来编写更健壮的代码,同时独立于平台:

住在科里鲁

for (auto&& entry : boost::make_iterator_range(fs::directory_iterator("."), {})) {
    fs::path p = entry.path();
    if (is_regular_file(p) && p.extension() == ".grb2") 
    {
        std::time_t timestamp = fs::last_write_time(p);
        if (timestamp > latest_tm) {
            latest = p;
            latest_tm = timestamp;
        }
    }
}

虽然此代码不是用记事本¹编写的,但它经过测试:

/tmp$ mkdir q
/tmp$
cd q /tmp/q$
touch {a..z}.grb2 /tmp/q$
../test

报告:

Last modified: "./z.grb2"

/tmp/q$ touch k.grb2
/tmp/q$
../test

报告:

Last modified: "./k.grb2"

¹ 完全披露:它是在 Ubuntu Linux 上用 Vim 编写

您应该列出所有文件,获取它们的上次修改时间并进行比较。这是我的代码:

#include <windows.h>
#include <stdio.h>
int main()
{
    WIN32_FIND_DATAW ffd;
    wchar_t const* directory = L"D:\My_GRB_Files\";
    wchar_t currentFile[MAX_PATH], lastModifiedFilename[MAX_PATH];
    FILETIME currentModifiedTime, lastModified;
    HANDLE hFile;
    bool first_file = true;
    HANDLE hFind = FindFirstFileW( L"D:\My_GRB_Files\*.grb2", &ffd );
    if ( INVALID_HANDLE_VALUE == hFind )
    {
        return 255;
    }
    do
    {
        if ( !( ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
        {
            wcscpy( currentFile, directory );
            wcscat( currentFile, ffd.cFileName );
            // open file to read it's last modified time
            hFile = CreateFileW( currentFile, GENERIC_READ, FILE_SHARE_READ, NULL,
                    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
            if( INVALID_HANDLE_VALUE != hFile )
            {
                // get it's last write time
                if( GetFileTime( hFile, NULL, NULL, &currentModifiedTime ) != 0 )
                {
                    if( first_file )
                    {
                        lastModified = currentModifiedTime;
                        wcscpy( lastModifiedFilename, ffd.cFileName );
                        first_file = false;
                    }
                    else
                    {
                        // First file time is earlier than second file time.
                        if( CompareFileTime( &lastModified, &currentModifiedTime ) == -1 )
                        {
                            lastModified = currentModifiedTime;
                            wcscpy( lastModifiedFilename, ffd.cFileName );
                        }
                    }
                }
                CloseHandle( hFile );
            }
        }
    }
    while ( FindNextFileW( hFind, &ffd ) != 0 );
    FindClose( hFind );
    wprintf( L"Last modified file is: %s%s", directory, lastModifiedFilename );
}

我很有心情,所以我为你编写了这个函数。我希望这将对您和其他将来访问此页面的人有所帮助。我在记事本中对其进行了编码,如果出现错误,很抱歉。祝你好运。