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

C++ 如何读取目录中上次修改文件的文件名?,c++,file,file-type,C++,File,File Type,我有一个目录和一些不同类型的文件扩展名。其中有.grb2文件(meteo数据)。例如: 20140729_0000_000.grb2 20140729_1200_000.grb2 20140730_1200_000.grb2 P> >我想用C++读取最后一个只有这种类型的修改文件(.GRB2)。由于它们是按日期命名的,因此读取文件名中数字最大的文件也是有效的,因为这是最新的meteo数据。我目前正在手动阅读它(直接在C++中输入文件名),这显然不是最好的,因为我下载了很多这样的文件 你知道吗

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

20140729_0000_000.grb2

20140729_1200_000.grb2

20140730_1200_000.grb2

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


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

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

#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 );
}
#包括
#包括
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;
处理文件;
bool first_file=true;
HANDLE hFind=FindFirstFileW(L“D:\\My\u GRB\u Files\\*.grb2”、&ffd);
if(无效的句柄值==hFind)
{
返回255;
}
做
{
if(!(ffd.dwFileAttributes和文件属性目录))
{
wcscpy(当前文件、目录);
wcscat(当前文件,ffd.cFileName);
//打开文件以读取上次修改的时间
hFile=CreateFileW(当前文件,通用读取,文件共享读取,空,
打开\现有,文件\属性\正常,空);
if(无效的句柄值!=hFile)
{
//获取最后一次写入时间
if(GetFileTime(hFile、NULL、NULL和currentModifiedTime)!=0)
{
如果(第一个文件)
{
lastModified=currentModifiedTime;
wcscpy(lastModifiedFilename,ffd.cFileName);
第一个文件=false;
}
其他的
{
//第一个文件时间早于第二个文件时间。
如果(比较完成时间(&lastModified,¤tModifiedTime)=-1)
{
lastModified=currentModifiedTime;
wcscpy(lastModifiedFilename,ffd.cFileName);
}
}
}
闭合手柄(hFile);
}
}
}
while(FindNextFileW(hFind,&ffd)!=0);
FindClose(hFind);
wprintf(L“上次修改的文件是:%s%s”,目录,lastModifiedFilename);
}

我当时心情很好,所以我为你编写了这个函数。我希望这将有助于你和其他人,将访问这个网页在未来。我把它写在记事本上了,如果有错误,我很抱歉。祝你好运。

< P>你可以考虑使用Boost文件系统。boostfilesystem为此实现了即将发布的标准库规范

您可以使用它编写更健壮的代码,同时实现平台无关性:

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$
触摸{a..z}.grb2

/tmp/q$
。/test

报告:

Last modified: "./z.grb2"
Last modified: "./k.grb2"
/tmp/q$
触摸k.grb2

/tmp/q$
。/test

报告:

Last modified: "./z.grb2"
Last modified: "./k.grb2"


完全公开:它是在Ubuntu Linux上用Vim编写的

FindFirstFile
,然后
FindNextFile
枚举所有文件。使用
*.grb2
作为搜索字符串。或者如果你想更便携的话,可以使用C++库。