221 lines
5.9 KiB
C++
221 lines
5.9 KiB
C++
// ==========================================================================
|
|
// Class Implementation : COXFileList
|
|
// ==========================================================================
|
|
|
|
// Source file : filelist.cpp
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h" // standard MFC include
|
|
#include "filelist.h" // class specification
|
|
#include "dos.h" // for _dos_findfirst, ...
|
|
#include "UTB64Bit.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNAMIC(COXFileList, CObject)
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Definition of static members
|
|
|
|
|
|
// Data members -------------------------------------------------------------
|
|
// protected:
|
|
// COXPathSpec m_path;
|
|
// --- The path specification where to look for files
|
|
|
|
// CObList m_fileList; // Contains objects of class COXFileSpec
|
|
// --- The list of file specifications found in the above specified path
|
|
|
|
// private:
|
|
|
|
// Member functions ---------------------------------------------------------
|
|
// public:
|
|
|
|
COXFileList::COXFileList()
|
|
:
|
|
m_path()
|
|
{
|
|
}
|
|
|
|
COXPathSpec COXFileList::GetPath() const
|
|
{
|
|
return m_path;
|
|
}
|
|
|
|
BOOL COXFileList::SetPath(COXPathSpec path)
|
|
{
|
|
if (path.GetFileName().IsEmpty())
|
|
path.SetFileName(_T("*.*"));
|
|
if (path.MakeAbsolute())
|
|
{
|
|
m_path = path;
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
TRACE(TEXT("COXFileList::SetPath : Path spec is invalid : %s\n"), path.GetPath());
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL COXFileList::Search()
|
|
{
|
|
#ifdef WIN32
|
|
COXFileSpec* pFile;
|
|
WIN32_FIND_DATA fileData;
|
|
HANDLE hFindFile;
|
|
BOOL bFileFound(TRUE);
|
|
|
|
hFindFile = FindFirstFile(m_path.GetPath(), &fileData);
|
|
if(hFindFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
while (bFileFound)
|
|
{
|
|
if (((fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) &&
|
|
(fileData.cFileName[0] != _T('.')))
|
|
{
|
|
pFile = new COXFileSpec;
|
|
pFile->SetFileName(fileData.cFileName);
|
|
pFile->SetTime(CTime(fileData.ftLastWriteTime));
|
|
ASSERT(fileData.nFileSizeHigh == 0);
|
|
pFile->SetLength(fileData.nFileSizeLow);
|
|
pFile->SetAttributes((CFile::Attribute)fileData.dwFileAttributes);
|
|
m_fileArray.Add(pFile);
|
|
}
|
|
|
|
bFileFound = FindNextFile(hFindFile,&fileData);
|
|
}
|
|
FindClose(hFindFile);
|
|
}
|
|
return TRUE;
|
|
|
|
#else
|
|
COXFileSpec* pFile;
|
|
_find_t fileInfo;
|
|
BOOL bFileFound;
|
|
|
|
bFileFound = (_dos_findfirst(m_path.GetPath(), _A_NORMAL | _A_ARCH, &fileInfo) == 0);
|
|
while (bFileFound)
|
|
{
|
|
pFile = new COXFileSpec;
|
|
pFile->SetFileName(fileInfo.name);
|
|
pFile->SetTime(CTime((WORD)fileInfo.wr_date, (WORD)fileInfo.wr_time));
|
|
pFile->SetLength(fileInfo.size);
|
|
pFile->SetAttributes((CFile::Attribute)fileInfo.attrib);
|
|
m_fileArray.Add(pFile);
|
|
bFileFound = (_dos_findnext(&fileInfo) == 0);
|
|
}
|
|
return TRUE;
|
|
#endif
|
|
}
|
|
|
|
const CObArray* COXFileList::GetList() const
|
|
{
|
|
return &m_fileArray;
|
|
}
|
|
|
|
const COXFileSpec* COXFileList::GetAt(int nIndex) const
|
|
{
|
|
return (COXFileSpec*) m_fileArray.GetAt(nIndex);
|
|
}
|
|
|
|
void COXFileList::Sort()
|
|
{
|
|
// This algorithm will sort a list using selection sort
|
|
// The array contains objects from position 0 to END
|
|
// nIndexNotSorted points to the first not yet sorted object,
|
|
// so the set [0..nIndexNotSorted - 1] is already sorted
|
|
// This algorithm searches the not yet sorted objects in the set
|
|
// [nIndexNotSorted..END] for the smallest object and adds this
|
|
// to the sorted objects
|
|
// nIndexCompare point to the last object in this set that has
|
|
// already been examined
|
|
// The algorithm ends when all objects are sorted
|
|
int nIndexNotSorted = 0;
|
|
int nIndexCompare = 0;
|
|
COXFileSpec* pSmallestFile = NULL; // point to array[nIndexSorted]
|
|
COXFileSpec* pCompareFile = NULL; // point to array[nIndexCompare]
|
|
COXFileSpec* pSwapFile;
|
|
|
|
while (nIndexNotSorted <= m_fileArray.GetUpperBound())
|
|
{
|
|
ASSERT(m_fileArray[nIndexNotSorted]->IsKindOf(RUNTIME_CLASS(COXFileSpec)));
|
|
pSmallestFile = (COXFileSpec*)m_fileArray[nIndexNotSorted];
|
|
nIndexCompare = nIndexNotSorted;
|
|
nIndexCompare++;
|
|
|
|
while (nIndexCompare <= m_fileArray.GetUpperBound())
|
|
{
|
|
ASSERT(m_fileArray[nIndexCompare]->IsKindOf(RUNTIME_CLASS(COXFileSpec)));
|
|
pCompareFile = (COXFileSpec*)m_fileArray[nIndexCompare];
|
|
if (*pCompareFile < *pSmallestFile)
|
|
{
|
|
pSwapFile = pSmallestFile;
|
|
m_fileArray[nIndexNotSorted] = m_fileArray[nIndexCompare];
|
|
m_fileArray[nIndexCompare] = pSwapFile;
|
|
pSmallestFile = (COXFileSpec*)m_fileArray[nIndexNotSorted];
|
|
}
|
|
nIndexCompare++;
|
|
}
|
|
nIndexNotSorted++;
|
|
}
|
|
}
|
|
|
|
void COXFileList::ClearList()
|
|
{
|
|
COXFileSpec* pFile;
|
|
int nIndex = 0;
|
|
int nMaxIndex = PtrToInt(m_fileArray.GetUpperBound());
|
|
while (nIndex <= nMaxIndex)
|
|
{
|
|
ASSERT(m_fileArray[nIndex]->IsKindOf(RUNTIME_CLASS(COXFileSpec)));
|
|
pFile = (COXFileSpec*)m_fileArray[nIndex];
|
|
delete pFile;
|
|
nIndex++;
|
|
}
|
|
m_fileArray.RemoveAll();
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
void COXFileList::Dump(CDumpContext& dc) const
|
|
{
|
|
CObject::Dump(dc);
|
|
dc << _T("\nm_path : ");
|
|
m_path.Dump(dc);
|
|
dc << _T("\nm_fileArray : ") << m_fileArray;
|
|
}
|
|
|
|
void COXFileList::AssertValid() const
|
|
{
|
|
CObject::AssertValid();
|
|
}
|
|
#endif
|
|
|
|
COXFileList::~COXFileList()
|
|
{
|
|
ClearList();
|
|
}
|
|
|
|
// protected:
|
|
|
|
// private:
|
|
|
|
// Message handlers ---------------------------------------------------------
|
|
|
|
// ==========================================================================
|