You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.8 KiB
99 lines
2.8 KiB
//
|
|
// Copyright 2011 The Android Open Source Project
|
|
//
|
|
|
|
// File Finder implementation.
|
|
// Implementation for the functions declared and documented in FileFinder.h
|
|
|
|
#include <utils/Vector.h>
|
|
#include <utils/String8.h>
|
|
#include <utils/KeyedVector.h>
|
|
|
|
#include <dirent.h>
|
|
#include <sys/stat.h>
|
|
|
|
#include "DirectoryWalker.h"
|
|
#include "FileFinder.h"
|
|
|
|
//#define DEBUG
|
|
|
|
using android::String8;
|
|
|
|
// Private function to check whether a file is a directory or not
|
|
bool isDirectory(const char* filename) {
|
|
struct stat fileStat;
|
|
if (stat(filename, &fileStat) == -1) {
|
|
return false;
|
|
}
|
|
return(S_ISDIR(fileStat.st_mode));
|
|
}
|
|
|
|
|
|
// Private function to check whether a file is a regular file or not
|
|
bool isFile(const char* filename) {
|
|
struct stat fileStat;
|
|
if (stat(filename, &fileStat) == -1) {
|
|
return false;
|
|
}
|
|
return(S_ISREG(fileStat.st_mode));
|
|
}
|
|
|
|
bool SystemFileFinder::findFiles(String8 basePath, Vector<String8>& extensions,
|
|
KeyedVector<String8,time_t>& fileStore,
|
|
DirectoryWalker* dw)
|
|
{
|
|
// Scan the directory pointed to by basePath
|
|
// check files and recurse into subdirectories.
|
|
if (!dw->openDir(basePath)) {
|
|
return false;
|
|
}
|
|
/*
|
|
* Go through all directory entries. Check each file using checkAndAddFile
|
|
* and recurse into sub-directories.
|
|
*/
|
|
struct dirent* entry;
|
|
while ((entry = dw->nextEntry()) != NULL) {
|
|
String8 entryName(entry->d_name);
|
|
if (entry->d_name[0] == '.') // Skip hidden files and directories
|
|
continue;
|
|
|
|
String8 fullPath = basePath.appendPathCopy(entryName);
|
|
// If this entry is a directory we'll recurse into it
|
|
if (isDirectory(fullPath.string()) ) {
|
|
DirectoryWalker* copy = dw->clone();
|
|
findFiles(fullPath, extensions, fileStore,copy);
|
|
delete copy;
|
|
}
|
|
|
|
// If this entry is a file, we'll pass it over to checkAndAddFile
|
|
if (isFile(fullPath.string()) ) {
|
|
checkAndAddFile(fullPath,dw->entryStats(),extensions,fileStore);
|
|
}
|
|
}
|
|
|
|
// Clean up
|
|
dw->closeDir();
|
|
|
|
return true;
|
|
}
|
|
|
|
void SystemFileFinder::checkAndAddFile(const String8& path, const struct stat* stats,
|
|
Vector<String8>& extensions,
|
|
KeyedVector<String8,time_t>& fileStore)
|
|
{
|
|
// Loop over the extensions, checking for a match
|
|
bool done = false;
|
|
String8 ext(path.getPathExtension());
|
|
ext.toLower();
|
|
for (size_t i = 0; i < extensions.size() && !done; ++i) {
|
|
String8 ext2 = extensions[i].getPathExtension();
|
|
ext2.toLower();
|
|
// Compare the extensions. If a match is found, add to storage.
|
|
if (ext == ext2) {
|
|
done = true;
|
|
fileStore.add(path,stats->st_mtime);
|
|
}
|
|
}
|
|
}
|
|
|