ディレクトリ読みクラス 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 ======================
|