diff options
Diffstat (limited to 'base/file_util_posix.cc')
-rw-r--r-- | base/file_util_posix.cc | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc index aca0ff9..26f4b8f 100644 --- a/base/file_util_posix.cc +++ b/base/file_util_posix.cc @@ -28,6 +28,23 @@ #include "base/string_util.h" #include "base/time.h" +namespace { + +bool IsDirectory(const FTSENT* file) { + switch (file->fts_info) { + case FTS_D: + case FTS_DC: + case FTS_DNR: + case FTS_DOT: + case FTS_DP: + return true; + default: + return false; + } +} + +} // namespace + namespace file_util { #if defined(GOOGLE_CHROME_BUILD) @@ -560,10 +577,14 @@ void FileEnumerator::GetFindInfo(FindInfo* info) { } int CompareFiles(const FTSENT** a, const FTSENT** b) { - // Order lexicographically, ignoring case and whether they are files or - // directories. - // TODO(yuzo): make this case-sensitive, directories-then-files, and - // internationalized. + // Order lexicographically with directories before other files. + const bool a_is_dir = IsDirectory(*a); + const bool b_is_dir = IsDirectory(*b); + if (a_is_dir != b_is_dir) + return a_is_dir ? -1 : 1; + + // TODO(yuzo): make this internationalized when encoding detection function + // becomes available. return base::strcasecmp((*a)->fts_name, (*b)->fts_name); } |