Windows 添加过滤器

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

我有一段代码,它可以抓取某个目录中的文件。我想按时间筛选这些文件。我希望文件类型被过滤20秒或更少。如何将此筛选器添加到代码中?多谢各位

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多字节。再次感谢您!我有点喜欢雷蒙德。您的代码表明,您知道如何枚举文件并获取枚举中每个文件的年龄。所以我有点惊讶你不知道如何回答你自己的问题。我的答案有什么你自己无法得出的?我只是零零碎碎地学习,我做这个兼职才两个月,休息一下吧!!!!!!但你没有回答我的问题。我的答案有什么你自己都想不出来的?