Index: base/file_util_posix.cc |
=================================================================== |
--- base/file_util_posix.cc (revision 19057) |
+++ base/file_util_posix.cc (working copy) |
@@ -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 @@ |
} |
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); |
} |