我有一个目录,其中包含一些不同类型扩展名的文件。其中,有.grb2文件(meteo数据)。例如:
...
20140729_0000_000.grb2
20140729_1200_000.grb2
20140730_1200_000.grb2
...
问题是我想用C ++读取最后一个只有这种类型的修改过的文件(.grb2)。由于它们是按日期命名的,因此读取文件名中编号最大的文件也是有效的,因为这是最新的meteo数据。我目前正在手动阅读它(直接在C ++中输入文件名),这显然不是最佳的,因为我下载了很多这些文件。
你有什么想法吗?顺便说一句,我在Windows中工作(如果有任何帮助的话)。
答案 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, ¤tModifiedTime ) != 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, ¤tModifiedTime ) == -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 );
}
我心情很好,所以我为你编写了这个功能。我希望这将有助于您和将来访问此页面的其他人。我用记事本编码,很抱歉如果有错误。祝你好运。