📄 browsedir.cpp
字号:
/*********************************************
这是CBrowseDir的类实现文件 BrowseDir.cpp
/***********************************************/
#include "stdlib.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "list.h"
#include "BrowseDir.h"
#include "conio.h"
#include "menu.h"
#include <iostream>
using namespace std;
CBrowseDir::CBrowseDir()
{
//用当前目录初始化m_szInitDir
method = 1;
getcwd(m_szInitDir,_MAX_PATH);
//如果目录的最后一个字母不是'\',则在最后加上一个'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
strcpy(szCurrent, m_szInitDir);
strcpy(programDir, m_szInitDir);
prevDir.reinit(szCurrent);
}
bool CBrowseDir::SetInitDir(const char *dir)
{
//先把dir转换为绝对路径
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
return false;
//判断目录是否存在
if (_chdir(m_szInitDir) != 0)
return false;
//如果目录的最后一个字母不是'\',则在最后加上一个'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
strcpy(szCurrent, m_szInitDir);
return true;
}
bool CBrowseDir::BeginBrowse(const char *filespec)
{
ProcessDir(m_szInitDir,NULL);
return BrowseDir(m_szInitDir,filespec);
}
bool CBrowseDir::BrowseDir
(const char *dir,const char *filespec)
{
int flag = 1;
int flush = 1;
char topline[_MAX_PATH];
char parent[_MAX_PATH];
char drive[_MAX_PATH];
_chdir(dir);
int select;
List filelist, afilelist;
List sublist, asublist;
long hFile;
_finddata_t fileinfo;
char sel[3];
char ch;
int count = 0;
while (1) {
if (flag) {
if ((hFile=_findfirst(filespec,&fileinfo)) != -1) {
do {
if (!(fileinfo.attrib & _A_SUBDIR)) {
char filename[_MAX_PATH];
strcpy(filename,szCurrent);
strcat(filename,fileinfo.name);
afilelist.add(filename);
filelist.add(fileinfo.name);
if (!ProcessFile(filename)) return false;
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1) {
do {
if ((fileinfo.attrib & _A_SUBDIR)) {
if (strcmp(fileinfo.name,".") != 0 && strcmp (fileinfo.name,"..") != 0) {
char subdir[_MAX_PATH];
strcpy(subdir,szCurrent);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
asublist.add(subdir);
sublist.add(fileinfo.name);
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
flag = 0;
}
if (flush) {
system("CLS");
cout<<"┌──────────────────────────────────────┐";
sprintf(topline, "│【当前目录】:%-63.63s│", szCurrent);
cout<<topline;
cout<<"└──────────────────────────────────────┘";
filelist.disfile();
sublist.dissub(filelist.getlen());
cout<<"【请选择文件或子目录】:__\b\b";
flush = 0;
}
//for (int u = 0; u < count; u++) cout<<sel[u];
ch = getch();
if (ch == 46 && prevDir.getlen() > 0) {
select = -1;
break;
}
if (ch == 47 && prevDir.getlen() > 0) {
select = -2;
break;
}
if (ch == 42 && strcmp(szCurrent, programDir)) {
select = -3;
break;
}
if (ch == 45) {
sprintf(drive, "%c:\\", dir[0]-1);
if (_chdir(drive) != 0) {
_chdir(dir);
continue;
}
_chdir(dir);
select = -4;
break;
}
if (ch == 43) {
sprintf(drive, "%c:\\", dir[0]+1);
if (_chdir(drive) != 0) {
_chdir(dir);
continue;
}
_chdir(dir);
select = -5;
break;
}
//if (ch == 0) continue;
if (ch == 27) {
select = 0;
break;
}
if (ch == 9) {
printAllInfo();
flush = 1;
continue;
}
if (ch == '\r') {
select = atoi(sel);
if (method == 0 && count == 0) {
select = -6;
break;
}
if (method && select > 0 && select <= filelist.getlen()) break;
if (select > filelist.getlen() && select <= filelist.getlen()+sublist.getlen() ) break;
continue;
}
if (ch == '\b') {
if (count > 0) {
cout<<"\b_\b";
count--;
}
continue;
}
if (!isdigit(ch)) continue;
if (count >= 2) continue;
sel[count++] = ch;
cout<<ch;
}
switch (select) {
case -1 :
if (strcpy(parent, prevDir.gettop()) ) {
strcpy(szCurrent, parent);
//ProcessDir(parent,dir);
if (!BrowseDir(parent, filespec)) return false;
}
break;
case -2 : prevDir.reinit(szCurrent, 1);
if (strcpy(parent, prevDir.gettop()) ) {
strcpy(szCurrent, parent);
if (!BrowseDir(parent, filespec)) return false;
}
break;
case -3 : strcpy(szCurrent, programDir);
prevDir.reinit(programDir);
if (!BrowseDir(programDir, filespec)) return false;
break;
case -4 : prevDir.init();
prevDir.add(drive);
if (strcpy(parent, prevDir.gettop()) ) {
strcpy(szCurrent, parent);
if (!BrowseDir(parent, filespec)) return false;
}
break;
case -5 : prevDir.init();
prevDir.add(drive);
if (strcpy(parent, prevDir.gettop()) ) {
strcpy(szCurrent, parent);
if (!BrowseDir(parent, filespec)) return false;
}
break;
case -6 : getcwd(szSelectFile,_MAX_PATH);
break;
case 0 : return false;
default : if (select <= filelist.getlen()) {
strcpy(szSelectFile, afilelist.get(select));
break;
}
ProcessDir(asublist.get(select - filelist.getlen()),dir);
if (!BrowseDir(asublist.get(select - filelist.getlen()),filespec)) return false;
break;
}
return true;
}
bool CBrowseDir::ProcessFile(const char *filename)
{
return true;
}
void CBrowseDir::ProcessDir(const char
*currentdir,const char *parentdir)
{
if (currentdir)
strcpy(szCurrent, currentdir);
if (parentdir)
prevDir.add(parentdir);
}
bool CBrowseDir::GetFile(char* filedir)
{
if (!szSelectFile) return false;
strcpy(filedir, szSelectFile);
return true;
}
void CBrowseDir::SetMethod(int n)
{
method = n;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -