2011-10-02 127 views
-3

我有这个代码抓取某个目录中的文件。我想按时间过滤这些文件。我希望将文件类型过滤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; 
} 
+0

我不明白。你已经有99.9%的代码已经写好了。你是否想要从fileList变量中删除所有超过20秒的文件? (或保留它们)。或者你想基于时间对文件进行排序吗? – selbie

+0

我只想返回20秒或更少的文件。因为我会删除它们。如果没有20秒或更少的文件,程序退出。谢谢。 –

+0

你是什么意思没有研究努力!我是如何得到这一点的,如何得到一些帮助! –

回答

1

在这里你走。我更改了FindFile调用以显式使用“A”版本(并明确使用WIN32_FIND_DATAA而不是WIN32_FIND_DATA)。转换为LPCSTR看起来很可疑,但我不知道你是否用unicode编译开启或关闭(默认情况下,Visual Studio默认为Unicde“W”apis)。

此外,你没有调用FindClose,我补充说。否则,我只是使用GetSystemTime获取当前时间,将其转换为文件时间,然后将文件时间参考为64位整数。 “unsigned long long”与unsigned __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; 
} 
+0

谢谢你的帮助。我不认为这是你。我无法理解它。如果你不想帮忙的话。雷蒙德为什么觉得他必须无礼? –

+0

使用VS 2010多字节。再一次感谢你! –

+0

我很喜欢雷蒙德。您的代码证明您知道如何枚举文件并获取枚举中每个文件的年龄。所以我很惊讶你不明白如何回答你自己的问题。我的答案是什么,你无法自拔? – selbie

相关问题