Во сколько это возвращается - PullRequest
0 голосов
/ 03 октября 2011

Глубоко в соусе здесь. Я не слишком много работал со временем, поэтому я немного запутался здесь. Я знаю, что есть 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 ]

1 голос
/ 03 октября 2011

Не совсем ответ, но вы можете прочитать о туннелировании файловой системы .

Это может помешать вам делать то, что вы пытаетесь сделать в некоторых ситуациях.

1 голос
/ 03 октября 2011

Я не знаю, что вы сделали, чтобы попытаться отладить это, но ваш код не работает вообще.Причина в том, что вы передаете getFileList () строку wstring, но затем передаете ее в ANSI-версию FindFirstFile ().Если вы не #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);

Другой вариант - переключить все символыСтроки в широкие символы, но в любом случае вы должны быть последовательными во всем.Как только вы это сделаете, программа будет работать, как и ожидалось

Что касается вашего последнего вопроса, ваша программа вообще не фильтруется по времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...