⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directory.cpp

📁 C++&datastructure书籍源码,以前外教提供现在与大家共享
💻 CPP
字号:
#include <iostream>using namespace std;#include <windows.h>#include "directory.h"//#include <string.h>//#include <dirent.h>//#include <errno.h>//#include <sys/stat.h>const int PATH_SIZE = 1024;  // local storagestatic char buf[PATH_SIZE];//// author: Owen Astrachan// date: 10/15/93, ported to Dec stations on 11/8/93// modified 1/18/96 to add Direntry constructor// modified 5/10/99, ported to NT, cleaned up redundant code//// implementation of directory classes for reading info// about directories.  See directory.h//////// this substitures for a WIN32 Handle, but encapsulatedstruct HHandle{    HANDLE item;    HHandle()    { item = INVALID_HANDLE_VALUE;}};// this substitutes for a WIN32_FIND_DATA, but encapsulatedstruct WIN32_DATA{    WIN32_FIND_DATA item;    WIN32_DATA()    { }};DirEntry::DirEntry(){	//currently empty}        DirEntry::DirEntry(WIN32_DATA* dat)   : myName(""),     myPath(""),     mySize(0),     myIsDirectory(false){    WIN32_FIND_DATA * data = &dat->item;        FILETIME   ft;    SYSTEMTIME sft;    if (FileTimeToLocalFileTime(&data->ftLastWriteTime,&ft))    {   if (FileTimeToSystemTime(&ft,&sft))        {   myDate = Date(sft.wMonth,sft.wDay,sft.wYear);            myTime = ClockTime(sft.wSecond,sft.wMinute,sft.wHour);        }    }    	myName = data->cFileName;	mySize = data->nFileSizeHigh*(MAXDWORD+1) + data->nFileSizeLow;	myIsDirectory = data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;}DirEntry::~DirEntry(){	//currently empty}string DirEntry::Path() const{    return myPath;}string DirEntry::Name() const{    return myName;}long int DirEntry::Size() const{    return mySize; }bool DirEntry::IsDir() const{    return myIsDirectory; }Date DirEntry::GetDate() const{    return myDate;}ClockTime DirEntry::GetTime() const{    return myTime;}void DirStream::Initialize(const string & s)// postcondition: all private data initialized     {    myPath = s;    if (s.find(":") != string::npos || s[0] == DIR_SEPARATOR[0])    {        bool success = SetCurrentDirectory(s.c_str());        if (! success)        {   cout << "failed to find directory " << s << endl;            myStatus = false;            myStream->item = INVALID_HANDLE_VALUE;            return;        }    }    else    {   int len = GetCurrentDirectory(PATH_SIZE,buf);        myPath = string(buf) + DIR_SEPARATOR + s;    // remember path to this directory    }        if (myStream->item != INVALID_HANDLE_VALUE && !myIsClosed)    {   if (!FindClose(myStream->item))	    {  cout << "error closing directory " << myPath << endl;	    }    }    myIsClosed = false;    string allFiles = myPath + DIR_SEPARATOR + "*"; // get all files    myStream->item = FindFirstFile(allFiles.c_str(), &myData->item);    SetEntry();    myStatus = myStream->item != INVALID_HANDLE_VALUE;   // check if open succeeded}DirStream::DirStream(const string & s)   : myStream(new HHandle),     myData(new WIN32_DATA),     myStatus(false),     myIsClosed(true)// postcondition: initialized to directory whose path is s     {    Initialize(s);}DirStream::DirStream()   : myStream(new HHandle),     myData(new WIN32_DATA),     myStatus(false),     myIsClosed(true)// postcondition: initialized to current directory     {    int len = GetCurrentDirectory(PATH_SIZE,buf);    string self(buf);    Initialize(self);}bool DirStream::fail(){    return ! myStatus || myStream->item == INVALID_HANDLE_VALUE;}void DirStream::open(const string & s){    Initialize(s);}DirStream::~DirStream(){    close();}void DirStream::close(){    if (myStream->item != INVALID_HANDLE_VALUE)    {   FindClose(myStream->item);        myIsClosed = true;    }}void DirStream::SetEntry(){    myEntry = DirEntry(myData);    myEntry.myPath = myPath + DIR_SEPARATOR + myEntry.myName;}void DirStream::Init(){    Initialize(myPath);}void DirStream::Next(){    bool retval = FindNextFile(myStream->item,&myData->item);    if (! retval)     {   myStatus = false;    }    else    {   SetEntry();    }}DirEntry DirStream::Current(){    return myEntry;}bool DirStream::HasMore(){    return ! fail();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -