什么时候回来

时间:2011-10-02 20:46:03

标签: windows visual-c++

这里的酱汁很深。我没有时间工作,所以我在这里有点困惑。我知道有FILETIME和SYSTEMTIME。我在这一点上想要得到的(因为它可能会改变)是不到20秒的文件。这会在几秒钟内返回文件及其大小和内容,我想知道它是按时间过滤的地方,如果是,我如何调整它以满足我的需要。谢谢。

using namespace std;
typedef vector<WIN32_FIND_DATA> tFoundFilesVector;
std::wstring LastWriteTime;  
int getFileList(wstring filespec, tFoundFilesVector &foundFiles)
{
    WIN32_FIND_DATA findData;
    HANDLE h;
    int validResult=true;

    int numFoundFiles = 0;
    h = FindFirstFile(filespec.c_str(), &findData);

    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;
    //__int64 nFileSize;
          //LARGE_INTEGER li;    
    //li.LowPart = ftNow.dwLowDateTime;
    //li.HighPart = ftNow.dwHighDateTime;

    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;

        cout << "FILE: '" << iter->cFileName << "', AGE: " << (_int64)age/10000000UL << "  seconds" << endl;
    }
}

int main()
{
    string fileSpec = "*.*";
    tFoundFilesVector foundFiles;
    tFoundFilesVector::iterator iter;

    int foundCount = 0;

    getFileList(L"c:\\Mapper\\*.txt", foundFiles);
    getFileList(L"c:\\Mapper\\*.jpg", foundFiles);

    foundCount = foundFiles.size();
    if (foundCount)
    {
        cout << "Found "<<foundCount<<" matching files.\n";
        showFileAge(foundFiles);
    }
    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我不知道你为尝试调试这个做了什么,但你的代码根本不起作用。原因是你将getFileList()传递给wstring,然后将其传递给FindFirstFile()的ANSI版本。除非您#define UNICODE或使用适当的编译器选项,否则所有系统调用都将使用char *,而不是UNICODE。

最简单的解决方法是简单地将getFileList()的声明更改为:

int getFileList(const char * filespec, tFoundFilesVector &foundFiles)

将对FindFirstFile()的调用更改为:

h = FindFirstFile((LPCSTR)filespec, &findData);

然后将对它的调用更改为:

getFileList("c:\\Mapper\\*.txt", foundFiles);
getFileList("c:\\Mapper\\*.jpg", foundFiles);

您的另一个选择是将所有字符串切换为宽字符,但无论哪种方式,您都需要始终保持一致。一旦你这样做,该程序按预期工作。

至于你的最后一个问题,你的程序根本没有按时间过滤。

答案 1 :(得分:1)

不是一个答案,但您可能想了解file system tunneling

它可能会阻止您在某些情况下尝试做的事情。