这里的酱汁很深。我没有时间工作,所以我在这里有点困惑。我知道有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;
}
答案 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。
它可能会阻止您在某些情况下尝试做的事情。