如何读取目录中最后修改过的文件的文件名?

时间:2014-11-30 19:08:58

标签: c++ file file-type

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

...

20140729_0000_000.grb2

20140729_1200_000.grb2

20140730_1200_000.grb2

...

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

你有什么想法吗?顺便说一句,我在Windows中工作(如果有任何帮助的话)。

2 个答案:

答案 0 :(得分:4)

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

您可以使用它来编写更强大的代码并同时独立于平台:

<强> Live On Coliru

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编写的

答案 1 :(得分:1)

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

#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 );
}

我心情很好,所以我为你编写了这个功能。我希望这将有助于您和将来访问此页面的其他人。我用记事本编码,很抱歉如果有错误。祝你好运。