STARTDECL(scan_folder) (Value &fld, Value &divisor) { string folder = SanitizePath(fld.sval->str()); fld.DEC(); if (divisor.ival <= 0) divisor.ival = 1; #ifdef WIN32 WIN32_FIND_DATA fdata; HANDLE fh = FindFirstFile((folder + "\\*.*").c_str(), &fdata); if (fh == INVALID_HANDLE_VALUE) return Value(0, V_NIL); auto list = g_vm->NewVector(0, V_VECTOR); do { if (strcmp(fdata.cFileName, ".") && strcmp(fdata.cFileName, "..")) { ULONGLONG size = (static_cast<ULONGLONG>(fdata.nFileSizeHigh) << (sizeof(uint) * 8)) | fdata.nFileSizeLow; AddDirItem(list, fdata.cFileName, fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? -1 : size, divisor.ival); } } while(FindNextFile(fh, &fdata)); FindClose(fh); return Value(list); #elif !defined(ANDROID) glob_t gl; string mask = folder + "/*"; if (glob(mask.c_str(), GLOB_MARK | GLOB_TILDE, NULL, &gl)) return Value(0, V_NIL); auto list = g_vm->NewVector(0, V_VECTOR); for (size_t fi = 0; fi < gl.gl_pathc; fi++) { string xFileName = gl.gl_pathv[fi]; bool isDir = xFileName[xFileName.length()-1] == '/'; if (isDir) xFileName = xFileName.substr(0, xFileName.length() - 1); string cFileName = xFileName.substr(xFileName.find_last_of('/') + 1); struct stat st; stat(gl.gl_pathv[fi], &st); AddDirItem(list, cFileName.c_str(), isDir ? -1 : st.st_size, divisor.ival); } globfree(&gl); return Value(list); #else return Value(0, V_NIL); #endif }
void CBrowseDlg::FillMe() { m_ctlDirs.DeleteAllItems(); // TODO: GetDeviceName CLocalizedString sMyDevice; sMyDevice.LoadString(IDS_MYDEVICE); m_hRootItem = AddDirItem(TVI_ROOT, sMyDevice, ICON_DEVICE, FALSE); AddPathItems(m_hRootItem, _T("\\")); m_ctlDirs.Expand(m_hRootItem, TVE_EXPAND); }
void CBrowseDlg::AddPathItems(HTREEITEM hParent, CString strPath) { WIN32_FIND_DATA fd; CString mask; mask.Format(_T("%s*.*"), strPath); HANDLE hFind = FindFirstFile(mask, &fd); if (hFind != INVALID_HANDLE_VALUE) { do { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { HTREEITEM hItem = AddDirItem(hParent, fd.cFileName, ICON_DIR, FALSE); // add one child, to display the plus sing CString strSubDir = strPath + fd.cFileName + _T("\\"); AddPossibleChild(hItem, strSubDir); } else if (m_bFiles) { CString strFileName = CString(fd.cFileName); if (HasExt(strFileName)) { CString strFilePath = strPath + strFileName; SHFILEINFO sfi = { 0 }; SHGetFileInfo(strFilePath, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_SMALLICON); // | SHGFI_SYSICONINDEX); int nIdx = m_oImageList.Add(sfi.hIcon); if (nIdx == -1) nIdx = ICON_FILE; HTREEITEM hItem = AddDirItem(hParent, strFileName, nIdx, FALSE); DeleteObject(sfi.hIcon); } } } while (FindNextFile(hFind, &fd)); FindClose(hFind); // Sort the items in the tree control using my callback procedure. TVSORTCB tvs; tvs.hParent = hParent; tvs.lpfnCompare = DirFileCompareProc; tvs.lParam = (LPARAM) &m_ctlDirs; m_ctlDirs.SortChildrenCB(&tvs); } }
void CBrowseDlg::AddPossibleChild(HTREEITEM hParent, CString strPath) { WIN32_FIND_DATA fd; CString mask; mask.Format(_T("%s*.*"), strPath); HANDLE hFind = FindFirstFile(mask, &fd); if (hFind != INVALID_HANDLE_VALUE) { do { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { AddDirItem(hParent, fd.cFileName, ICON_DIR, FALSE); break; } else if (m_bFiles) { CString strFileName = CString(fd.cFileName); if (HasExt(strFileName)) { AddDirItem(hParent, fd.cFileName, ICON_FILE, FALSE); break; } } } while (FindNextFile(hFind, &fd)); FindClose(hFind); } }
void CBrowseDlg::OnNewFolder() { HTREEITEM hSelItem = m_ctlDirs.GetSelectedItem(); if (hSelItem == NULL) return; m_ctlDirs.ModifyStyle(0, TVS_EDITLABELS); m_ctlDirs.Expand(hSelItem, TVE_EXPAND); m_bExpandDelete = FALSE; HTREEITEM hNewItem = AddDirItem(hSelItem, _T(""), ICON_DIR, FALSE, TVI_FIRST); m_ctlDirs.Expand(hSelItem, TVE_EXPAND); m_bExpandDelete = TRUE; m_ctlDirs.EnsureVisible(hNewItem); m_ctlDirs.EditLabel(hNewItem); }