]>
git.saurik.com Git - android/aapt.git/blob - FileFinder.cpp
   2 // Copyright 2011 The Android Open Source Project 
   5 // File Finder implementation. 
   6 // Implementation for the functions declared and documented in FileFinder.h 
   8 #include <utils/Vector.h> 
   9 #include <utils/String8.h> 
  10 #include <utils/KeyedVector.h> 
  15 #include "DirectoryWalker.h" 
  16 #include "FileFinder.h" 
  20 using android::String8
; 
  22 // Private function to check whether a file is a directory or not 
  23 bool isDirectory(const char* filename
) { 
  25     if (stat(filename
, &fileStat
) == -1) { 
  28     return(S_ISDIR(fileStat
.st_mode
)); 
  32 // Private function to check whether a file is a regular file or not 
  33 bool isFile(const char* filename
) { 
  35     if (stat(filename
, &fileStat
) == -1) { 
  38     return(S_ISREG(fileStat
.st_mode
)); 
  41 bool SystemFileFinder::findFiles(String8 basePath
, Vector
<String8
>& extensions
, 
  42                                  KeyedVector
<String8
,time_t>& fileStore
, 
  45     // Scan the directory pointed to by basePath 
  46     // check files and recurse into subdirectories. 
  47     if (!dw
->openDir(basePath
)) { 
  51      *  Go through all directory entries. Check each file using checkAndAddFile 
  52      *  and recurse into sub-directories. 
  55     while ((entry 
= dw
->nextEntry()) != NULL
) { 
  56         String8 
entryName(entry
->d_name
); 
  57         if (entry
->d_name
[0] == '.') // Skip hidden files and directories 
  60         String8 fullPath 
= basePath
.appendPathCopy(entryName
); 
  61         // If this entry is a directory we'll recurse into it 
  62         if (isDirectory(fullPath
.string()) ) { 
  63             DirectoryWalker
* copy 
= dw
->clone(); 
  64             findFiles(fullPath
, extensions
, fileStore
,copy
); 
  68         // If this entry is a file, we'll pass it over to checkAndAddFile 
  69         if (isFile(fullPath
.string()) ) { 
  70             checkAndAddFile(fullPath
,dw
->entryStats(),extensions
,fileStore
); 
  80 void SystemFileFinder::checkAndAddFile(String8 path
, const struct stat
* stats
, 
  81                                        Vector
<String8
>& extensions
, 
  82                                        KeyedVector
<String8
,time_t>& fileStore
) 
  84     // Loop over the extensions, checking for a match 
  86     String8 
ext(path
.getPathExtension()); 
  88     for (size_t i 
= 0; i 
< extensions
.size() && !done
; ++i
) { 
  89         String8 ext2 
= extensions
[i
].getPathExtension(); 
  91         // Compare the extensions. If a match is found, add to storage. 
  94             fileStore
.add(path
,stats
->st_mtime
);