如何读取目录中上次修改的文件的文件名
How to read filename of the last modified file in a directory?
我有一个目录,其中包含一些不同类型的扩展名文件。其中,有.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, ¤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 );
}
我很有心情,所以我为你编写了这个函数。我希望这将对您和其他将来访问此页面的人有所帮助。我在记事本中对其进行了编码,如果出现错误,很抱歉。祝你好运。
相关文章:
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 什么文件可以修改 atom 的C++语法?
- 修改生成文件以简化框架 #include 路径
- Windows std::fstream 修改文件后打开()?
- Chilkat SFTP 文件修改时间不与上传更新
- 如何在 Windows 上的 C++ 中根据文件的修改时间读取目录中的文件
- 如何使用Winforms C#或C++.Net在不更改文件中其他内容的情况下修改jpg文件中的Orientation e
- 如何修改Lambda表达式以将输出放入文本文件
- 我如何确保修改.H文件时,使用Visual Studio 2008将包括其在内的.cc文件自动编译
- 在 Windows 中修改文件夹时通知我的应用程序
- C++ - 修改文件而不创建新文件
- 如何在C++的目录中查找具有通配符匹配的最后一个修改文件
- C++:无法修改文件中的某个记录
- 如何修改文件夹中所有文件的代码
- 读取和修改文件的最佳方式(c++)
- MAKEFILE:在不修改文件的情况下将目标视为已更新
- iPhone:在Xcode中编译C++文件而不修改文件扩展名
- 每次修改文件时运行getline