void FileTreeWalker::traverseArgv(const StringArray &a, FileNameHandler &nameHandler, bool recurse) { // static
  StringHashMap<IndexedStringArray> dirMap;
  int arrayIndex = 0;

  for(size_t i = 0; i < a.size(); i++) {
    String name = a[i];
    if(name[name.length()-1] == '\\') {
      name = left(name,name.length()-1);
    }
    if(hasWildCard(name)) {
      FileNameSplitter info(name);
      String path = toLowerCase(info.getDrive() + info.getDir());
      String wildCard = toLowerCase(info.getFileName() + info.getExtension());

      IndexedStringArray *wcArray = dirMap.get(path);
      if(wcArray == NULL) {
        IndexedStringArray ia(path, arrayIndex++, true);
        ia.add(wildCard);
        dirMap.put(path,ia);
      } else {
        wcArray->add(wildCard);
      }
    } else { // no wildCards
      struct _stat st;
      if(stat(name,st) < 0) {
        continue;
      }
      dirMap.put(name,IndexedStringArray(name, arrayIndex++, (st.st_mode & _S_IFDIR) ? true : false));
    }
  }
  CompactArray<IndexedStringArray*> a1;
  for(Iterator<IndexedStringArray> it = dirMap.values().getIterator(); it.hasNext();) {
    a1.add(&it.next());
  }

  a1.sort(compareByIndex);
  for(size_t i = 0; i < a1.size(); i++) {
    const IndexedStringArray *ia = a1[i];
    if(ia->isDir()) {
      handleDir(ia->getPath(), nameHandler, *ia, recurse);
    } else {
      handleSingleFile(ia->getPath(), nameHandler);
    }
  }
}