📄 directory.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 + -