ディレクトリ読みクラス BReadDirディレクトリ内のファイル名をリストしたり、ソートするクラス。// 使用例: // char dirname1[] = "g:\\temp\\*.jpg"; // BReadDir dir1(dirname1); // ディレクトリ // dir1.Sort(); // ソート // if (dir1.GetCount() == 0) //ファイル数 // return -1; // char *tp; // while (tp = dir1.GetNext()) { // ファイル名を順に返す =================================== readdir.h start ====================== // readdir.h #ifndef __BREADDIRCLASS__ #define __BREADDIRCLASS__ BOOL IsKanji(int c); int BFileAttr(const char* name); char* Strrchr(const char* str,char chr) ; class BReadDir { private: char **m_pdata; int m_nPos; int m_nCount; public: BReadDir(); BReadDir(LPCSTR name); ~BReadDir(); int Open(LPCSTR name); void Close(); void Sort(int asdesc = 0,int cases = 0); int GetCount(){return m_nCount;}; char *GetFirst(); char *GetNext(); }; #endif =================================== readdir.h end ======================== =================================== readdir.cpp start ==================== // readdir.cpp #include "stdafx.h" #include "readdir.h" void QuickSort(char **a, int n, int asdes,int cases,int offset, int length); BReadDir::BReadDir() { m_nPos = 0; m_nCount = 0; m_pdata = NULL; } BReadDir::BReadDir(LPCSTR name) { Open(name); } int BReadDir::Open(LPCSTR name) { m_nPos = 0; m_nCount = 0; m_pdata = NULL; HANDLE hdir; WIN32_FIND_DATA fdata; hdir = ::FindFirstFile(name,&fdata); if (hdir == INVALID_HANDLE_VALUE) return 0; BOOL ok = 1; int nSize = 0; int nCur = 0; while (ok) { if ( !(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { if (nSize < nCur + 1) { char *tp = new char[(nSize + 256)*sizeof(char*)]; if (tp == NULL) break; if (m_pdata) { CopyMemory(tp,m_pdata,nSize*sizeof(char*)); delete [] m_pdata; } m_pdata = (char**)tp; nSize += 256; } int len = lstrlen(fdata.cFileName) + 1; char *tp = new char[len]; if (tp == NULL) break; CopyMemory(tp,fdata.cFileName,len); m_pdata[nCur++] = tp; } ok = ::FindNextFile(hdir,&fdata); } ::FindClose(hdir); m_nCount = nCur; return m_nCount; } void BReadDir::Sort(int asdesc,int cases) { if (m_nCount == 0) return; QuickSort(m_pdata, m_nCount,asdesc,cases,0,0); } BReadDir::~BReadDir() { Close(); } void BReadDir::Close() { if (m_nCount == 0) return; for (int i = 0; i < m_nCount;i++) delete [] m_pdata[i]; delete [] m_pdata; m_nCount = 0; m_pdata = NULL; } char *BReadDir::GetFirst() { if (m_nCount == 0) return NULL; m_nPos = 0; return m_pdata[m_nPos++]; } char *BReadDir::GetNext() { if (m_nCount <= m_nPos) return NULL; return m_pdata[m_nPos++]; } static int bcmp(char *p1,char *p2, int cases, int offset, int length) { if (p1 == p2) return 0; char *b1,*b2; char buf1[1024],buf2[1024]; if (cases == 0) { lstrcpy(buf1,p1); lstrcpy(buf2,p2); CharUpper(buf1); CharUpper(buf2); b1 = buf1; b2 = buf2; } else { b1 = p1; b2 = p2; } int len1 = lstrlen(b1) - offset; int len2 = lstrlen(b2) - offset; if (len1 < 0 || len2 < 0) return lstrcmp(b1,b2); if (length == 0 || length > len1 || length > len2) return lstrcmp(b1+offset,b2+offset); return memcmp(b1+offset,b2+offset,length); } static void QuickSort(char **a, int n, int asdes, int cases, int offset, int length) { char **i, **j, **l, **r; char **st1[32], **st2[32], ***s1, ***s2; char *x, *w; if(n <= 1) return; int aflag = asdes == 0 ? 1 : -1; s1 = st1; s2 = st2; *s1 = a; *s2 = a + n - 1; do { l = *s1--; r = *s2--; // if(r - l < 11) inssort_c(l, r - l + 1); // else // { do { i = l; j = r; x = *(l + (int)((r - l) / 2)); do { while(aflag * bcmp(x, *i,cases,offset,length) > 0) i++; while(aflag * bcmp(*j, x,cases,offset,length) > 0) j--; if(i > j) break; w = *i; *i++ = *j; *j-- = w; } while(i <= j); if(j - l < r - i) { if(i < r) { *(++s1) = i; *(++s2) = r; } r = j; } else { if(l < j) { *(++s1) = l; *(++s2) = j; } l = i; } } while(l < r); // } }while (s1 >= st1); return; } static unsigned char sjis_tab[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 8x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 9x */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Ax */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Cx */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Dx */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Ex */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, /* Fx */ }; static BOOL IsKanji(int c) { return sjis_tab[c & 0xff]; } // 戻り値:−1 エラー // 0 ディレクトリ // 1 ファイル int BFileAttr(const char* name) { DWORD rc = GetFileAttributes(name); if (rc == (unsigned long)INVALID_HANDLE_VALUE) return rc; if( rc & FILE_ATTRIBUTE_DIRECTORY) // dir ? return 0; return 1; } char* Strrchr(const char* str,char chr) { char *tp = NULL; int len = lstrlen(str); for (int i = 0;i < len;i++) { if (IsKanji(str[i])) { i++; continue; } if (str[i] == chr) tp = (char*)str + i; } return tp; } =================================== readdir.cpp end ====================== |