📄 menu.cpp
字号:
#include <iostream>
#include <fstream>
#include <cstring>
#include <conio.h>
#include "io.h"
#include "menu.h"
#include "list.h"
#include "BrowseDir.h"
using namespace std;
void printMainMenu()
{
system("CLS");
cout<<"┌─────[文件加密解密助手]─────┐"<<endl;
cout<<"├───────────────────┤"<<endl;
cout<<"│ [1].加密文件 [2].解密文件 │"<<endl;
cout<<"│ [3].关 于 [4].退 出 │"<<endl;
cout<<"└───────────────────┘"<<endl;
}
void printSubMenu1()
{
cout<<"┌───[加 密 文 件]───┐"<<endl;
cout<<"│[1].设置密码 [2].返回上级 │"<<endl;
//cout<<"│[2].查看信息 [3].返回上级 │"<<endl;
cout<<"└─────────────┘"<<endl;
}
void printSubMenu2()
{
cout<<"┌───[解 密 文 件]───┐"<<endl;
cout<<"│[1].输入密码 [2].返回上级 │"<<endl;
//cout<<"│[2].查看信息 [3].返回上级 │"<<endl;
cout<<"└─────────────┘"<<endl;
}
void printArithmetic()
{
cout<<"┌──────────────────────────┐"<<endl;
cout<<"│加密解密算法说明: │"<<endl;
cout<<"│TEA - Tiny Encryption Algorithm │"<<endl;
cout<<"│Feistel cipher by David Wheeler & Roger M. Needham │"<<endl;
cout<<"│(extended version) │"<<endl;
cout<<"└──────────────────────────┘"<<endl;
}
void printAuthor()
{
cout<<"┌──────────────────┐"<<endl;
cout<<"│版 本 号 : 1 . 0 │"<<endl;
cout<<"│程序设计 : 李 洁 信 │"<<endl;
cout<<"│E - MAIL : segadcman@sina.com │"<<endl;
cout<<"│联 系 : 北方工业大学 │"<<endl;
cout<<"└──────────────────┘"<<endl;
}
void printHelp()
{
cout<<"┌──────────────────┐"<<endl;
cout<<"│文件选择模式按键说明: │"<<endl;
cout<<"│ESC -- 退出 │"<<endl;
cout<<"│TAB -- 显示当前文件夹文件详细信息 │"<<endl;
cout<<"│- -- 后退一个盘符 │"<<endl;
cout<<"│+ -- 前进一个盘符 │"<<endl;
cout<<"│/ -- 返回当前盘根目录 │"<<endl;
cout<<"│. -- 返回上级目录 │"<<endl;
cout<<"│其他说明: │"<<endl;
cout<<"│加密文件名:*.sec │"<<endl;
cout<<"└──────────────────┘"<<endl;
}
void printCode(char* code, int status)
{
char ch;
int n = 0;
if (status) {
cout<<"┌───[设 置 密 码]────┐"<<endl;
cout<<"└──请设置文件密码:________ ┘\b\b\b\b\b\b\b\b\b\b\b";
}
else {
cout<<"┌───[输 入 密 码]────┐"<<endl;
cout<<"└──请输入文件密码:________ ┘\b\b\b\b\b\b\b\b\b\b\b";
}
while (1) {
ch = getch();
if (ch == '\r') break;
if (ch == '\b') {
if (n > 0) {
cout<<"\b_\b";
n--;
}
continue;
}
if (n >= LEN-1) continue;
code[n++] = ch;
cout<<"*";
}
cout<<endl;
cout<<endl;
code[n] = '\0';
if (status) {
cout<<"[您设置的密码为]: [";
if (code[0] == '\0') cout<<"空密码]"; else cout<<code<<"]";
cout<<endl;
}
}
bool mean(const char *file)
{
char unmean[] = "/*:<>?|\\\"";
if (file[0] == '.') return false;
for (int i = 0; i < strlen(unmean); i++) {
if (strchr(file, unmean[i])) return false;
}
if (file[0] == '.' || file[strlen(file)-1] == '.') return false;
return true;
}
bool getFix(const char *file, char *fix)
{
char *cp = strrchr(file, '.');
if (!cp) return false;
int i = 0;
while (*cp) {
fix[i++] = *cp++;
}
fix[i] = '\0';
return true;
}
bool isEncrypted(const char *file)
{
int i, j;
char fix[FILE_NAME_MAX_LEN];
getFix(file, fix);
if (!strcmp(fix, czOutFix)) return true;
else return false;
}
bool changeName(char *file, const char *fix)
{
int i;
char *cp = strrchr(file, '.');
for (i = 0; i < strlen(fix); i++) {
*cp++ = fix[i];
}
*cp = '\0';
return true;
}
bool addSuffix(char *file, const char *fix)
{
int i, j;
if (strlen(file)+strlen(fix) >= FILE_NAME_MAX_LEN)
return false;
for (i = strlen(file), j = 0; j < strlen(fix); i++, j++) {
file[i] = fix[j];
}
file[i] = '\0';
return true;
}
int inputFileName(char *file, const char *fix)
{
/* cout<<"★[输入<exit>或<EXIT>退出,默认扩展名为]: <"<<fix<<">★"<<endl;
cout<<"★[请输入文件名]:";
cin>>file;
if (!strcmp(file, "exit") || !strcmp(file, "EXIT")) return 0;
while (!mean(file)) {
printMainMenu();
cout<<"★[输入<exit>或<EXIT>退出,默认扩展名为]: <"<<fix<<">★"<<endl;
cout<<"☆[文件名包含非法字符]"<<endl;
cout<<"★[请重新输入文件名]:";
cin>>file;
if (!strcmp(file,"exit") || !strcmp(file, "EXIT")) return 0;
}
if (!strchr(file, '.')) addSuffix(file, fix); */
CBrowseDir statdir;
if (statdir.BeginBrowse(fix)) {
statdir.GetFile(file);
}
else return 0;
printMainMenu();
ifstream fin(file, ios::in | ios::binary);
if (!fin.is_open()) {
fin.close();
cout<<"[无法打开 <"<<file<<"> 文件]"<<endl;
cout<<"[按任意键返回]"<<endl;
getch();
return 0;
}
fin.close();
printFileInfo(file);
return 1;
}
int outputPath(char* path)
{
CBrowseDir statdir;
statdir.SetMethod(0);
if (statdir.BeginBrowse("*.*")) {
statdir.GetFile(path);
}
else return 0;
}
int Menu(char* file, char *code)
{
char ch;
printMainMenu();
ch = getch();
while (!strchr("1234", ch)) ch = getch();
switch (ch) {
case '1' : if (SubMenu1(file, code)) return 1;
else return 0;
break;
case '2' : if (SubMenu2(file, code)) return 2;
else return 0;
break;
case '3' : if (SubMenu3()) return 3;
break;
case '4' : return 4;
break;
default :
break;
}
}
int SubMenu1(char * file, char * code)
{
char ch;
if (!inputFileName(file, "*.*")) return 0;
printSubMenu1();
do {
ch = getch();
}while (!strchr("12", ch));
switch (ch) {
case '1':
//printFileInfo(file);
printCode(code, 1);
return 1;
break;
case '2':
return 0;
break;
case '3': return 0;
break;
default : return 0;
break;
}
}
int SubMenu2(char* file, char *code)
{
char ch;
if (!inputFileName(file, "*.sec")) return 0;
printSubMenu2();
do {
ch = getch();
}while (!strchr("12", ch));
switch (ch) {
case '1': //printFileInfo(file);
printCode(code, 0);
return 1;
break;
case '2': //printFileInfo(file);
return 0;
break;
case '3': return 0;
break;
default : return 0;
break;
}
}
int SubMenu3()
{
system("CLS");
printArithmetic();
printAuthor();
printHelp();
return 1;
}
bool printFileInfo(char* file)
{
//system("CLS");
char fname[_MAX_PATH];
char *fp = strrchr(file, '\\') + 1;
int i = 0;
while (*fp) {
fname[i++] = *fp++;
}
fname[i] = '\0';
struct _finddata_t c_file;
long hFile;
if( (hFile = _findfirst(fname, &c_file )) == -1L )
printf( "No *.c files in current directory!\n" );
else {
printf( "┌──┬──┬──┬──────────┬────────────┬─────┐");
printf( "│只读│隐藏│系统│文 件 名 称 │文 件 最 后 修 改 时 间 │容 量│");
printf( "├──┼──┼──┼──────────┼────────────┼─────┤");
printf( ( c_file.attrib & _A_RDONLY ) ? "│ 是 │" : "│ 否 │" );
printf( ( c_file.attrib & _A_SYSTEM ) ? " 是 │" : " 否 │" );
printf( ( c_file.attrib & _A_HIDDEN ) ? " 是 │" : " 否 │" );
printf( "%-20.20s│%.24s│%8ldKB│", c_file.name, ctime( &( c_file.time_write ) ), c_file.size/1024 );
printf( "└──┴──┴──┴──────────┴────────────┴─────┘");
}
_findclose(hFile);
return true;
}
bool printAllInfo()
{
struct _finddata_t c_file;
long hFile;
int pause = -1;
system("CLS");
if( (hFile = _findfirst("*.*", &c_file )) == -1L
&& (c_file.attrib & _A_SUBDIR) ) {
printf( "No *.* files in current directory!\n" );
}
else {
++pause;
printf( "┌──┬──┬──┬──────────┬────────────┬─────┐");
printf( "│只读│隐藏│系统│文 件 名 称 │文 件 最 后 修 改 时 间 │容 量│");
printf( "├──┼──┼──┼──────────┼────────────┼─────┤");
if ( strcmp(c_file.name,".") && strcmp (c_file.name,"..") ) {
printf( ( c_file.attrib & _A_RDONLY ) ? "│ 是 │" : "│ 否 │" );
printf( ( c_file.attrib & _A_SYSTEM ) ? " 是 │" : " 否 │" );
printf( ( c_file.attrib & _A_HIDDEN ) ? " 是 │" : " 否 │" );
printf( "%-20.20s│%.24s│%8ldKB│", c_file.name, ctime( &( c_file.time_write ) ), c_file.size/1024 );
}
}
/* Find the rest of the .c files */
while( _findnext( hFile, &c_file ) == 0 ) {
++pause;
if (pause == 0) {
printf("[按任意键继续显示]");
getch();
system("CLS");
printf( "┌──┬──┬──┬──────────┬────────────┬─────┐");
printf( "│只读│隐藏│系统│文 件 名 称 │文 件 最 后 修 改 时 间 │容 量│");
printf( "├──┼──┼──┼──────────┼────────────┼─────┤");
}
if ( strcmp(c_file.name,".") && strcmp (c_file.name,"..") ) {
printf( ( c_file.attrib & _A_RDONLY ) ? "│ 是 │" : "│ 否 │" );
printf( ( c_file.attrib & _A_SYSTEM ) ? " 是 │" : " 否 │" );
printf( ( c_file.attrib & _A_HIDDEN ) ? " 是 │" : " 否 │" );
printf( "%-20.20s│%.24s│", c_file.name, ctime( &( c_file.time_write ) ) );
if (c_file.attrib & _A_SUBDIR) printf("文 件 夹│");
else printf("%8ldKB│", c_file.size/1024);
}
if (pause == 18) {
pause = -1;
printf( "└──┴──┴──┴──────────┴────────────┴─────┘");
}
}
if (pause != -1)
printf( "└──┴──┴──┴──────────┴────────────┴─────┘");
_findclose( hFile );
printf("[按任意键返回]");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -