Windows 添加过滤器
我有一段代码,它可以抓取某个目录中的文件。我想按时间筛选这些文件。我希望文件类型被过滤20秒或更少。如何将此筛选器添加到代码中?多谢各位Windows 添加过滤器,windows,visual-c++,Windows,Visual C++,我有一段代码,它可以抓取某个目录中的文件。我想按时间筛选这些文件。我希望文件类型被过滤20秒或更少。如何将此筛选器添加到代码中?多谢各位 using namespace std; typedef vector<WIN32_FIND_DATA> tFoundFilesVector; std::wstring LastWriteTime; int getFileList(const char * filespec, tFoundFilesVector &foundFil
using namespace std;
typedef vector<WIN32_FIND_DATA> tFoundFilesVector;
std::wstring LastWriteTime;
int getFileList(const char * filespec, tFoundFilesVector &foundFiles)
{
WIN32_FIND_DATA findData;
HANDLE h;
int validResult=true;
int numFoundFiles = 0;
h = FindFirstFile((LPCSTR)filespec, &findData); //ansi
if (h == INVALID_HANDLE_VALUE)
return 0;
while (validResult)
{
numFoundFiles++;
foundFiles.push_back(findData);
validResult = FindNextFile(h, &findData);
}
return numFoundFiles;
}
void showFileAge(tFoundFilesVector &fileList)
{
unsigned _int64 fileTime, curTime, age;
tFoundFilesVector::iterator iter;
FILETIME ftNow;
CoFileTimeNow(&ftNow);
curTime = ((_int64) ftNow.dwHighDateTime << 32) + ftNow.dwLowDateTime;
for (iter=fileList.begin(); iter<fileList.end(); iter++)
{
fileTime = ((_int64)iter->ftLastWriteTime.dwHighDateTime << 32) + iter->ftLastWriteTime.dwLowDateTime;
age = curTime - fileTime;
wcout << "FILE: '" << iter->cFileName << "', AGE: " << (_int64)age/10000000UL << " seconds" << endl;
}
}
int main()
{
string fileSpec = "*.*";
tFoundFilesVector foundFiles;
tFoundFilesVector::iterator iter;
int foundCount = 0;
getFileList("c:\\Mapper\\*.txt", foundFiles);
getFileList("c:\\Mapper\\*.jpg", foundFiles);
foundCount = foundFiles.size();
if (foundCount)
{
wcout << "Found "<<foundCount<<" matching files.\n";
showFileAge(foundFiles);
}
system("pause");
return 0;
}
给你。我将FindFile调用更改为显式使用A版本,并显式使用WIN32_FIND_DATAA而不是WIN32_FIND_数据。对LPCSTR的转换看起来很可疑,但我不知道您是在使用unicode编译,还是在使用Visual Studio默认值编译unicode W API 另外,你没有给FindClose打电话,我补充说。否则,我只使用GetSystemTime获取当前时间,将其转换为文件时间,然后将文件时间引用为64位整数。unsigned long long与unsigned\uu int64相同
using namespace std;
typedef vector<WIN32_FIND_DATAA> tFoundFilesVector;
std::wstring LastWriteTime;
unsigned long long FileTimeToULL(const FILETIME& ft)
{
unsigned long long ull;
ull = ft.dwLowDateTime | (((unsigned long long)ft.dwHighDateTime) << 32);
return ull;
}
int getFileList(const char * filespec, tFoundFilesVector &foundFiles, DWORD dwMaxAgeInSeconds)
{
WIN32_FIND_DATAA findData={};
HANDLE h;
int validResult=true;
int numFoundFiles = 0;
unsigned long long now = 0;
unsigned long long age = 0;
SYSTEMTIME stnow = {};
FILETIME ftnow = {};
::GetSystemTime(&stnow);
::SystemTimeToFileTime(&stnow, &ftnow);
now = FileTimeToULL(ftnow);
h = FindFirstFileA(filespec, &findData); //ansi
validResult = (h != INVALID_HANDLE_VALUE);
while (validResult)
{
bool fIsDirectory = !!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
age = FileTimeToULL(findData.ftLastWriteTime);
if (age > now)
{
age = 0;
}
else
{
age = now - age;
}
// age is the diff between "right now" and when the file was last touched (in 100ns units)
// convert to seconds
age /= 10000000;
if ((age <= dwMaxAgeInSeconds) && (!fIsDirectory))
{
foundFiles.push_back(findData);
numFoundFiles++;
}
validResult = FindNextFileA(h, &findData);
}
if (h != INVALID_HANDLE_VALUE)
{
FindClose(h);
}
return numFoundFiles;
}
我不明白。您已经编写了99.9%的代码。是否要从fileList变量中删除所有早于20秒的文件?或者保留它们。还是要根据时间对文件进行排序?我只想返回20秒或更短时间的文件。因为我会删除它们。如果没有20秒或更短的文件,则程序退出。谢谢你。你说不做研究是什么意思!!!我是怎么走到这一步的,来点帮助怎么样!我并不是那个被否决的人,我只是建议您在代码中包含所有的拼图。即,如何枚举文件,以及如何获取每个文件的年龄。在任何情况下,我都会把你的代码放在下面。7549180没有代码,7606098映射代码,7612410映射代码,7629115相同的代码不同的问题……我相信作为一个程序员,一段代码有很多步骤,你可以修复或纠正一个问题,然后继续下一个问题。我没有请任何人帮忙写任何东西。我把这个代码带到桌面上,并一直在改进它。此外,寻求帮助有什么错,如果你选择不寻求帮助,你可以忽略这个线索。没必要对这件事发脾气!谢谢你的帮助。我以为不是你。我不明白。如果你不想帮忙,不要。为什么雷蒙德觉得他必须粗鲁?使用VS2010多字节。再次感谢您!我有点喜欢雷蒙德。您的代码表明,您知道如何枚举文件并获取枚举中每个文件的年龄。所以我有点惊讶你不知道如何回答你自己的问题。我的答案有什么你自己无法得出的?我只是零零碎碎地学习,我做这个兼职才两个月,休息一下吧!!!!!!但你没有回答我的问题。我的答案有什么你自己都想不出来的?