2011-10-02 5 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

여기 있습니다. 나는 "A"버전을 명시 적으로 사용하고 WIN32_FIND_DATA 대신 명시 적으로 WIN32_FIND_DATAA를 사용하도록 FindFile 호출을 변경했습니다. LPCSTR에 대한 캐스트가 의심스러워 보였지만 유니 코드를 켜거나 껐다가 컴파일하는지 알지 못했습니다 (기본적으로 Visual Studio는 기본적으로 Unicde "W"apis로 기본 설정되어 있습니다).

또한 FindClose를 호출하지 않았으며 추가했습니다. 그렇지 않으면 GetSystemTime을 사용하여 현재 시간을 가져 와서 파일 시간으로 변환 한 다음 파일 시간을 64 비트 int로 참조합니다. "unsigned long long"은 부호없는 __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

나는 Raymond와 어울린다. 당신의 코드는 당신이 파일을 열거하고 열거 내의 각 파일의 나이를 얻는 방법을 알고 있음을 보여주었습니다. 그래서 저는 당신이 당신 자신의 질문에 대답하는 방법을 이해하지 못함에 놀랐습니다. 네가 얻을 수 없었던 나의 대답에 대해 무엇을 했는가? – selbie

관련 문제