FileFinder.cpp revision 8a39da80b33691b0c82458c3b7727e13ff71277e
1//
2// Copyright 2011 The Android Open Source Project
3//
4
5// File Finder implementation.
6// Implementation for the functions declared and documented in FileFinder.h
7
8#include <utils/Vector.h>
9#include <utils/String8.h>
10#include <utils/KeyedVector.h>
11
12
13#include <iostream>
14
15#include "DirectoryWalker.h"
16#include "FileFinder.h"
17
18//#define DEBUG
19
20using android::String8;
21using std::cout;
22using std::endl;
23
24bool SystemFileFinder::findFiles(String8 basePath, Vector<String8>& extensions,
25                                 KeyedVector<String8,time_t>& fileStore,
26                                 DirectoryWalker* dw)
27{
28    // Scan the directory pointed to by basePath
29    // check files and recurse into subdirectories.
30    if (!dw->openDir(basePath)) {
31        return false;
32    }
33#ifdef DEBUG
34    cout << "FileFinder looking in " << basePath << endl;
35#endif // DEBUG
36    /*
37     *  Go through all directory entries. Check each file using checkAndAddFile
38     *  and recurse into sub-directories.
39     */
40    struct dirent* entry;
41    while ((entry = dw->nextEntry()) != NULL) {
42        String8 entryName(entry->d_name);
43        if (entry->d_name[0] == '.') // Skip hidden files and directories
44            continue;
45
46        String8 fullPath = basePath.appendPathCopy(entryName);
47        // If this entry is a directory we'll recurse into it
48        if (entry->d_type == DT_DIR) {
49            DirectoryWalker* copy = dw->clone();
50            findFiles(fullPath, extensions, fileStore,copy);
51            delete copy;
52        }
53
54        // If this entry is a file, we'll pass it over to checkAndAddFile
55        if (entry->d_type == DT_REG) {
56            checkAndAddFile(fullPath,dw->entryStats(),extensions,fileStore);
57        }
58    }
59
60    // Clean up
61    dw->closeDir();
62
63    return true;
64}
65
66void SystemFileFinder::checkAndAddFile(String8 path, const struct stat* stats,
67                                       Vector<String8>& extensions,
68                                       KeyedVector<String8,time_t>& fileStore)
69{
70#ifdef DEBUG
71    cout << "Checking file " << path << "...";
72#endif // DEBUG
73    // Loop over the extensions, checking for a match
74    bool done = false;
75    String8 ext(path.getPathExtension());
76    ext.toLower();
77    for (size_t i = 0; i < extensions.size() && !done; ++i) {
78        String8 ext2 = extensions[i].getPathExtension();
79        ext2.toLower();
80        // Compare the extensions. If a match is found, add to storage.
81        if (ext == ext2) {
82#ifdef DEBUG
83            cout << "Match";
84#endif // DEBUG
85            done = true;
86            fileStore.add(path,stats->st_mtime);
87        }
88    }
89#ifdef DEBUG
90    cout << endl;
91#endif //DEBUG
92}