home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 March
/
VPR9903A.BIN
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
CMD.C
< prev
next >
Wrap
Text File
|
1997-05-07
|
23KB
|
858 lines
// WZ EDITOR 標準機能 コマンドライン
// Copyright 1995-96 TY
//{###コマンドライン}
//MS-DOSのCOMMAND.COMのような機能を提供します。
//1.00F ディレクトリ対応copy/move/delete thanks m.osakoさん
//1.00H2 rename -> fileDelete for long filename 対応
#include <windows.h>
#include <windowsx.h>
#include "_filer.h"
#include "dialog.h"
#ifdef __FLAT__
static WIN32_FIND_DATA gfn_ffd;
static HANDLE gfn_hfind = INVALID_HANDLE_VALUE;
#else
extern "shell.dll" {
HINSTANCE WINAPI FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
HINSTANCE WINAPI ShellExecute(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,int);
}
static FILEFIND gfn_filefind;
static BOOL gfn_filefinding;
#endif
static mchar *gfn_szarg;
static mchar gfn_szfilename[CCHPATHNAME];
static mchar *getfilename(mchar szfilename[CCHPATHNAME],mchar *szarg,BOOL fwild)
{
mchar *szarg0 = szarg;
#ifdef __FLAT__
if (gfn_hfind != INVALID_HANDLE_VALUE) {
while(1) {
if (FindNextFile(gfn_hfind,&gfn_ffd)) {
if (gfn_ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
strcpy(szfilename,gfn_szfilename);
pathSetFileName(szfilename,gfn_ffd.cFileName);
return gfn_szarg;
} else {
//2.00B WZ32でcmd("del *.*")が失敗した
break;
}
}
FindClose(gfn_hfind);
gfn_hfind = INVALID_HANDLE_VALUE;
}
#else
if (gfn_filefinding) {
if (!fileFindNext(&gfn_filefind)) {
strcpy(szfilename,gfn_szfilename);
pathSetFileName(szfilename,gfn_filefind.name);
return gfn_szarg;
}
gfn_filefinding = FALSE;
}
#endif
if (!szarg) return NULL;
if (szfilename) szfilename[0] = 0;
szarg = strGetWordTop(szarg);
if (!*szarg) return NULL;
int len = strGetWordLen(szarg);
if (szfilename) {
strcpylen(szfilename,szarg,len);
pathFormLong(szfilename);//1.00H2
}
szarg += len;
gfn_szarg = szarg;
if (fwild) {
if (
szfilename[0] != '-' && // スイッチはそのまま返す
!pathIsFileName(szfilename)
) {
#ifdef __FLAT__
#if 1 //2.00B WZ32でcmd("del *.*")が"."を削除しようとして失敗した
gfn_hfind = FindFirstFile(szfilename,&gfn_ffd);
if (gfn_hfind != INVALID_HANDLE_VALUE) {
while(1) {
if (gfn_ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (FindNextFile(gfn_hfind,&gfn_ffd)) {
} else {
FindClose(gfn_hfind);
gfn_hfind = INVALID_HANDLE_VALUE;
break;
}
} else {
break;
}
}
if (gfn_hfind != INVALID_HANDLE_VALUE) {
strcpy(gfn_szfilename,szfilename);
pathSetFileName(szfilename,gfn_ffd.cFileName);
return gfn_szarg;
}
}
#else
gfn_hfind = FindFirstFile(szfilename,&gfn_ffd);
if (gfn_hfind != INVALID_HANDLE_VALUE) {
strcpy(gfn_szfilename,szfilename);
pathSetFileName(szfilename,gfn_ffd.cFileName);
return gfn_szarg;
}
#endif
#else
if (!fileFindFirst(szfilename,FA_NORMAL,&gfn_filefind)) {
gfn_filefinding = TRUE;
strcpy(gfn_szfilename,szfilename);
pathSetFileName(szfilename,gfn_filefind.name);
return gfn_szarg;
}
#endif
}
}
return szarg;
}
static int questionOverwrite(mchar* szfilename)
{
//2.96A 970213 上書きコピー確認で、キャンセル、すべて上書き、追加
HDIALOG hd = dialog("上書き確認");
dialogCaption(hd,szfilename);
dialogCaption(hd,"は存在します。");
dialogCaption(hd,"上書きコピーしてもよろしいですか?");
dialogSetFocus(hd,IDNO);
dialogSetH(hd);
dialogControlID(hd,IDYES);
dialogCmd(hd,"はい(&Y)",12);
dialogControlID(hd,IDNO);
dialogCmdDefault(hd,"いいえ(&N)",12);
dialogControlID(hd,IDCANCEL);
dialogCmd(hd,"キャンセル",12);
dialogControlID(hd,IDIGNORE);
dialogCmd(hd,"すべて上書き(&A)",20);
int ret = dialogOpen(hd);
if (ret) return ret;
if (!ret) return IDCANCEL;
}
#define FILECOPYEX_NOOVERWRITE 2
#define FILECOPYEX_CANCEL 3 //2.96A 970213
// return 1:OK
// 0:ERR
// FILECOPYEX_NOOVERWRITE:上書きしなかった
// FILECOPYEX_CANCEL:キャンセル
static BOOL fileCopyEx(mchar *szsrc,mchar *szdst,BOOL* fConfirmOverwrite)
{
if (*fConfirmOverwrite && fileIsExist(szdst)) {
#if 1//2.96A 970213
int ret = questionOverwrite(szdst);
switch(ret) {
case IDNO: return FILECOPYEX_NOOVERWRITE;
case IDCANCEL: {
return FILECOPYEX_CANCEL;
}
case IDIGNORE: {
*fConfirmOverwrite = FALSE;
break;
}
}
#else
if (question("%s は存在します。\n上書きコピーしてもよろしいですか?",szdst) != IDYES) {
return FILECOPYEX_NOOVERWRITE;
}
#endif
}
return fileCopy(szsrc,szdst);
}
// パスの最後が \ マークか?
// return:
// \ TRUE
// !\ FALSE
BOOL check_enmark(mchar *szd)
{
mchar *p = strGetLast(szd);
if (*p == '\\') return TRUE;
return FALSE;
}
// パスがディレクトリか?
BOOL cmd_pathIsDirectory(mchar *path)
{
mchar buff[CCHPATHNAME];
strcpy(buff,path);
pathFormDir(buff);
return pathIsDirectory(buff);
}
static BOOL _fdirtime; //2.00E mkdirでできたディレクトリのtimeを記録するか
// 記録したらFALSEにリセットする
#ifdef __FLAT__
static FILETIME _dirtime; //2.00E 記録した時間
#else
static DOSFILETIME _dirtime; //2.00E 記録した時間
#endif
// 対象ディレクトリが存在しなければ、mkdir
void check_dst_dir(mchar *szdstname)
{
mchar szd[CCHPATHNAME];
strcpy( szd, szdstname );
pathFormDir(szd);
#if 1//1.00H2 WZ32に対応
if (!pathIsDirectory(szd)) {
mkdir(szd);
#if 1//2.00E
if (_fdirtime) {
#ifdef __FLAT__
WIN32_FIND_DATA find;
HANDLE handle = FindFirstFile(szd,&find);
BOOL ret = (handle != INVALID_HANDLE_VALUE);
#else
FILEFIND find;
BOOL ret = !fileFindFirst(szd,FA_DIREC,&find);
#endif
if (ret) {
_fdirtime = FALSE;
#ifdef __FLAT__
_dirtime = find.ftCreationTime;
FindClose(handle);
#else
_dirtime = MAKELONG(find.wr_time,find.wr_date);
#endif
}
}
#endif
}
#else
FILEFIND find;
if ( fileFindFirst(szd,FA_DIREC,&find) ) {
mkdir(szd);
}
#endif
}
#define MAX_DIRDEPTH 10 // 最大ディレクトリ深さ
#define ENMFILE 0x12 // "No more files" error code
#ifdef __FLAT__
#define ffdGetFileName(ffd) ((ffd).cFileName)
#define ffdGetAtrDirectory(ffd) ((ffd).dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
#else
#define ffdGetFileName(ffd) ((ffd).name)
#define ffdGetAtrDirectory(ffd) ((ffd).attrib & FA_DIREC)
#endif
// ディレクトリを削除
BOOL dir_remove(mchar *szsrc)
{
mchar szcurdir[CCHPATHNAME];
mchar szd[CCHPATHNAME];
int ret;
strcpy(szd,szsrc);
pathFormDir(szd);
// 削除するディレクトリのドライブのカレントディレクトリをルートに
driveGetCurDir(szd[0],szcurdir);
driveSetCurDir(0,chartostr(szd[0])+\":\");//1.00F カレントディレクトリが削除できなかった
// delete
ret = !rmdir(szd);
// カレントディレクトリを戻す
driveSetCurDir(0,szcurdir);
return ret;
}
// ----------------------------------------------------- m.osako ---
// ディレクトリ毎コピー・削除
// 返り値仕様変更 by TY
// return TRUE: 正常終了
// FALSE: 失敗
// FILECOPYEX_NOOVERWRITE:上書きしなかったファイルがあった
// FILECOPYEX_CANCEL:キャンセル
// -----------------------------------------------------------------
int dirCopy(HWND hwnd, int id, mchar *szsrc, mchar *szdst,BOOL* fConfirmOverwrite,BOOL fMove,BOOL fDelete)
{
#ifdef __FLAT__
WIN32_FIND_DATA find[MAX_DIRDEPTH];
HANDLE thandle[MAX_DIRDEPTH];
int i;
for (i = 0;i < MAX_DIRDEPTH;i++) {
thandle[i] = INVALID_HANDLE_VALUE;
}
#else
FILEFIND find[MAX_DIRDEPTH];
int fattr = FA_DIREC|FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_SYSTEM;
#endif
mchar *psrc[MAX_DIRDEPTH], *pdst[MAX_DIRDEPTH];
int nest = 0; // 処理中のディレクトリ階層
int result = TRUE; // 返り値(コピー中にエラー発生したらFALSEになる)
BOOL fCopy = !fDelete;
BOOL f = TRUE; // findfirst flag
// attention("%s->%s", szsrc, szdst);
_fdirtime = TRUE;//2.00E
while(1) {
int ret;//TY
if (fCopy) check_dst_dir(szdst);
if (f) {
#ifdef __FLAT__
thandle[nest] = FindFirstFile(szsrc+"*.*",&find[nest]);
ret = (thandle[nest] == INVALID_HANDLE_VALUE);
#else
ret = fileFindFirst(szsrc+"*.*",fattr,&find[nest]);
#endif
} else {
#ifdef __FLAT__
ret = !FindNextFile(thandle[nest],&find[nest]);
#else
ret = fileFindNext(&find[nest]);
#endif
}
f = FALSE;
while(!ret) {
//information(szsrc + ffdGetFileName(find[nest]));
if (ffdGetFileName(find[nest])[0] != '.') {
if (ffdGetAtrDirectory(find[nest])) {
if (nest+1 >= MAX_DIRDEPTH) {
attention( "%d階層を越えます",MAX_DIRDEPTH );
return FALSE;
}
#ifdef __FLAT__
BOOL fSkip = (fCopy && !_fdirtime && (CompareFileTime(&find[nest].ftCreationTime,&_dirtime) >= 0));
#else
BOOL fSkip = (fCopy && !_fdirtime && MAKELONG(find[nest].wr_time,find[nest].wr_date) >= _dirtime);
#endif
if (fSkip) {
//2.00E filerでディレクトリ\testを\test\testにコピーすると無限ループした
// コピー中に作成したディレクトリも、コピー元のディレクトリとみなしていたため。
// コピー中に最初に作成したディレクトリの作成日時を保持し、この日時より
// 新しいディレクトリをコピー元で見つけた時は、そのディレクトリはコピーしないことにした
} else {
f = TRUE;
psrc[nest] = szsrc + strlen(szsrc);
strcat(szsrc,ffdGetFileName(find[nest]));
strcat(szsrc,"\\");
if (fCopy) {
pdst[nest] = szdst + strlen(szdst);
strcat(szdst,ffdGetFileName(find[nest]));
strcat(szdst,"\\");
}
nest++;
break;
}
} else {
if (fDelete) {
if (!fileDelete(szsrc + ffdGetFileName(find[nest]))) {
result = FALSE;
break;
}
} else if (fCopy) {
SetDlgItemText(hwnd,id,ffdGetFileName(find[nest]) + " を " + szdst + " にコピー中");
// wait(1000);
mchar* szsrcfilename = szsrc + ffdGetFileName(find[nest]);
int ret = fileCopyEx(szsrcfilename,szdst + ffdGetFileName(find[nest]),fConfirmOverwrite);
if (ret == FALSE) {
result = FALSE;
} else if (ret == FILECOPYEX_NOOVERWRITE) {
if (result == TRUE) result = ret;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
result = ret;
break;
} else if (fMove) {
fileDelete(szsrcfilename);
}
}
}
}
#ifdef __FLAT__
ret = !FindNextFile(thandle[nest],&find[nest]);
#else
ret = fileFindNext(&find[nest]);
#endif
}
if (result == FALSE) break;//1.00H エラー発生対応
if (result == FILECOPYEX_CANCEL) {
break;//2.96A 970213
}
if (f) {
// ネスト
//2.00E WZ32でディレクトリのコピー、削除するとハングアップした
} else {
#ifdef __FLAT__
BOOL fNoMoreFile = (GetLastError() == ERROR_NO_MORE_FILES);
#else
BOOL fNoMoreFile = (ret == ENMFILE);
#endif
if (!fNoMoreFile) {
//2.00E まだファイルがあるのに抜けたならerror
result = FALSE;
break;
}
#ifdef __FLAT__
if (nest) {
FindClose(thandle[nest]);
thandle[nest] = INVALID_HANDLE_VALUE;
}
#endif
if (fDelete) {
if (!dir_remove(szsrc)) {
result = FALSE;
break;
}
}
if (nest) {
// 階層ディレクトリの中をコピーしていた場合
nest--;
*psrc[nest] = 0;
if (fCopy) {
*pdst[nest] = 0;
}
} else {
if (fCopy) {
// 階層では無いので終了
break;
}
}
}
}
#ifdef __FLAT__
for (i = 0;i < MAX_DIRDEPTH;i++) {
FindClose(thandle[i]);
}
#endif
return result;
}
// ----------------------------------------------------- m.osako ---
// ディレクトリ毎削除
//
// 返り値仕様変更 by TY
// return TRUE: 正常終了
// FALSE: 失敗
// -----------------------------------------------------------------
BOOL dirDel(mchar *szsrc)
{
return dirCopy(NULL,-1,szsrc,NULL,FALSE,FALSE,TRUE);
}
void parsefile(mchar *szfile, mchar *szfilename)
{
// szfilenameからディレクトリ名を抜き出す
mchar szwk[CCHPATHNAME];
strcpy(szwk,szfilename);
pathFormDir(szwk);
strcpy(szfile,pathGetFileName(szwk));
pathSetDir(szfile);
}
//##cmd
int cmd_rename(mchar *szarg)
{
mchar szfilename[CCHPATHNAME];
mchar szdstname[CCHPATHNAME];
szarg = getfilename(szfilename,szarg,FALSE);
szarg = getfilename(szdstname,szarg,FALSE);
if (szarg) {
pathFormDir(szfilename);
pathFormDir(szdstname);
if (!rename(szfilename,szdstname)) return 1;
}
return 0;
}
// ディレクトリのコピーは、"directoryname\"の様に最後に"\"をつけて指定しないといけない
int cmd_mcopy(mchar *szarg)
{
int n = 0;
mchar szfilename[CCHPATHNAME];
mchar szdstname[CCHPATHNAME];
mchar szsrcpath[CCHPATHNAME] = {0}; //コピー元のパス
szarg = getfilename(szdstname,szarg,FALSE);
pathFormDir(szdstname);
mchar *dstfilename = szdstname + strlen(szdstname);
*dstfilename++ = '\\';
BOOL fConfirmOverwrite = FALSE;
//
HDIALOG hd = dialog("コピー");
int id = dialogCaptionDynamic(hd,NULL,80);//2.00B
dialogSetNoButton(hd);
HWND hwnd = dialogCreate(hd);
BOOL fail = FALSE;
check_dst_dir(szdstname);
while(1) {
szarg = getfilename(szfilename,szarg,TRUE);
if (!szarg) break;
if (szfilename[0] == '-') {//1.00F スイッチは無視
if (szfilename[1] == 'p') {
strcpy(szsrcpath,szfilename + 2);
pathFormLong(szsrcpath);//1.94 -p"path"に対応してなかった
pathSetDir(szsrcpath);
} else if (szfilename[1] == 'o') {
fConfirmOverwrite = TRUE;
}
} else {
strcpy(dstfilename,pathGetFileName(szfilename));
{
mchar c = *dstfilename;
*dstfilename = 0;//ファイル名を消去
SetDlgItemText(hwnd,id,pathGetFileName(szfilename) + " を " + szdstname + " にコピー中");
*dstfilename = c;
}
if (cmd_pathIsDirectory(szfilename)) {//TY
// directory
mchar szfile[CCHFILENAME];
parsefile(szfile, szfilename);
int ret = dirCopy(hwnd, id, szsrcpath+szfilename, szdstname + szfile,&fConfirmOverwrite,FALSE,FALSE);
//information("%d",ret);
if (ret == 0) {
fail = TRUE;
break;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
break;
}
} else {
// single file
int ret = fileCopyEx(szsrcpath + szfilename,szdstname,&fConfirmOverwrite);
if (ret == 0) {
fail = TRUE;
break;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
break;
}
}
n++;
}
}
dialogFree(hwnd);
if (fail) attention(szsrcpath + szfilename+" を "+szdstname+" にコピー失敗しました");
return n;
}
// ディレクトリの移動は、"directoryname\"の様に最後に"\"をつけて指定しないといけない
int cmd_mmove(mchar *szarg)
{
int n = 0;
mchar szfilename[CCHPATHNAME];
mchar szdstname[CCHPATHNAME];
szarg = getfilename(szdstname,szarg,FALSE);
pathFormDir(szdstname);
mchar *dstfilename = szdstname + strlen(szdstname);
*dstfilename++ = '\\';
*dstfilename = 0;
BOOL fConfirmOverwrite = FALSE;
BOOL fail = FALSE;
//
HDIALOG hd = dialog("移動");
int id = dialogCaptionDynamic(hd,NULL,80);//2.00B
dialogSetNoButton(hd);
HWND hwnd = dialogCreate(hd);
check_dst_dir(szdstname);
while(1) {
szarg = getfilename(szfilename,szarg,TRUE);
if (!szarg) break;
if (szfilename[0] == '-') {//1.00F スイッチは無視
if (szfilename[1] == 'o') {
fConfirmOverwrite = TRUE;
}
} else {
strcpy(dstfilename,pathGetFileName(szfilename));
{
mchar c = *dstfilename;
*dstfilename = 0;//ファイル名を消去
SetDlgItemText(hwnd,id,pathGetFileName(szfilename) + " を "+szdstname+" に移動中...");
*dstfilename = c;
}
if (szfilename[0] == szdstname[0]) {
// 同一ドライブ内なら、rename
if (!stricmp(szfilename,szdstname)) {
//1.00F 移動元と移動先が同じディレクトリの場合、ファイルが削除されていた
} else if (!rename(szfilename,szdstname)) {
// rename OK
n++;
} else {
// rename 失敗
if( cmd_pathIsDirectory(szfilename) )//TY
{
// directory
mchar szfile[CCHFILENAME];
parsefile(szfile, szfilename);
int ret = dirCopy(hwnd, id, szfilename, szdstname+szfile,&fConfirmOverwrite,TRUE,FALSE);
if (ret == 0) {
fail = TRUE;
break;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
break;
} else {
if (ret == TRUE) dirDel(szfilename);
n++;
}
} else {
// single file
int ret = fileCopyEx(szfilename,szdstname,&fConfirmOverwrite);
if (ret == FALSE) {
fail = TRUE;
break;
} else if (ret == TRUE) {
fileDelete(szfilename);
n++;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
break;
}
}
}
} else {
// ドライブが異なれば、コピー後に削除
if( cmd_pathIsDirectory(szfilename) )//TY
{
// directory
mchar szfile[CCHFILENAME];
parsefile(szfile, szfilename);
int ret = dirCopy(hwnd, id, szfilename, szdstname+szfile,&fConfirmOverwrite,TRUE,FALSE);
if (ret == FALSE) {
fail = TRUE;
break;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
break;
} else {
if (ret == TRUE) dirDel(szfilename);
n++;
}
} else {
// single file
//1.00F3 異なるドライブ間でファイル移動すると失敗した
int ret = fileCopyEx(szfilename,szdstname,&fConfirmOverwrite);
if (ret == TRUE) {
fileDelete(szfilename);
n++;
} else if (ret == FALSE) {
fail = TRUE;
break;
} else if (ret == FILECOPYEX_CANCEL) {
//2.96A 970213
break;
}
}
}
}
}
dialogFree(hwnd);
if (fail) attention(szfilename+" の移動に失敗しました");
return n;
}
int cmd_mkdir(mchar *szarg)
{
mchar szfilename[CCHPATHNAME];
szarg = getfilename(szfilename,szarg,FALSE);
if (szarg) {
if (!mkdir(szfilename)) return 1;
}
return 0;
}
int cmd_mkfile(mchar *szarg)
{
int n = 0;
mchar szfilename[CCHPATHNAME];
szarg = getfilename(szfilename,szarg,FALSE);
if (szarg) {
HFILE hf = _lopen(szfilename,OF_READ);
if (hf != HFILE_ERROR) {
_lclose(hf);
} else {
hf = _lcreat(szfilename,0);
if (hf != HFILE_ERROR) {
_lclose(hf);
n++;
}
}
}
return n;
}
static int _cmd_open(mchar *szarg,mchar *sw)
{
int n = 0;
mchar szfilename[CCHPATHNAME];
while(1) {
szarg = getfilename(szfilename,szarg,TRUE);
if (!szarg) break;
if (sw) strcat(szfilename,sw);
txOpenForkFast(text,szfilename);
n++;
}
return n;
}
int cmd_open(mchar *szarg)
{
return _cmd_open(szarg,NULL);
}
int cmd_openread(mchar *szarg)
{
return _cmd_open(szarg," --R");
}
//1.01
static BOOL fileIsOpenWz(mchar* szfilename)
{
// szfilenameのファイルをWZで開くかどうか返す
mchar szcommand[CCHPATHNAME];
if (FindExecutable(szfilename,NULL,szcommand) > 32) {
mchar *szfilename = pathGetFileName(szcommand);
// notepadが関連付けられてたらWZで開く
if (!stricmp(szfilename,"notepad.exe")) return TRUE;
return FALSE;
}
return TRUE;
}
//1.00H4
int cmd_winopen(mchar* szarg)
{
int n = 0;
mchar szfilename[CCHPATHNAME];
while(1) {
szarg = getfilename(szfilename,szarg,TRUE);
if (!szarg) break;
if (
fileIsOpenWz(szfilename) ||
ShellExecute(text->hwndbase,"open",szfilename,NULL,NULL,SW_SHOWNORMAL) <= 32
//2.00E マインスイーパーの起動がおかしかったのでSW_SHOW->SW_SHOWNORMALに変更
// 開けなかったらWZで開く
) {
txOpenForkFast(text,szfilename);
}
n++;
}
return n;
}
int cmd_view(mchar *szarg)
{
return _cmd_open(szarg," -v");
}
// ディレクトリの削除は、"directoryname\"の様に最後に"\"をつけて指定しないといけない
int cmd_del(mchar *szarg)
{
int n = 0;
mchar szfilename[CCHPATHNAME];
HDIALOG hd = dialog("削除");
int id = dialogCaptionDynamic(hd,NULL,80);//2.00B
dialogSetNoButton(hd);
HWND hwnd = dialogCreate(hd);
BOOL fail = FALSE;
while(1) {
szarg = getfilename(szfilename,szarg,TRUE);
if (!szarg) break;
SetDlgItemText(hwnd,id,szfilename+ " を削除中...");
if (cmd_pathIsDirectory(szfilename)) {// directory
if (dirDel(szfilename)) {
n++;
}
} else {
if (fileDelete(szfilename)) {
n++;
}
}
}
dialogFree(hwnd);
return n;
}
//##cmd実行
int TXAPI cmd(mchar *szcommand)
{
// DOSのcommand.comの内部コマンドの様な機能を提供します
// 例:
// cmd(\"mcopy a:\dst file1 file2 file3"); file1,2,3をa:\dstにコピー
// cmd(\"mcopy a:\dst -pa:\src file1 file2 file3");
// a:\srcのfile1,2,3をa:\dstにコピー
// cmd(\"mcopy a:\dst dir1\ file2 file3"); dir1\,file2,3をa:\dstにコピー
// cmd(\"mmove a:\dst\ file1 file2 file3"); file1,2,3をa:\dstに移動
// cmd(\"rename src dst); srcをdstに名前変更
// cmd(\"mkdir dst"); dstディレクトリを作成
// cmd(\"mkfile dst"); dstファイルを作成
// cmd(\"open file1 file2 file3"); file1,2,3をオープン
// cmd(\"openread file1 file2 file3"); file1,2,3をリードオンリーオープン(1.00Fで追加)
// cmd(\"winopen file1 file2 file3"); file1,2,3を関連づけられたアプリでオープン(1.00H4で追加)
// cmd(\"view file1 file2 file3"); file1,2,3をビュー
// cmd(\"del file1 file2 file3"); file1,2,3を削除
// cmd(\"del dir1\ file2 file3"); dir1\ file2,3を削除
// ※mcopy,mmove,open,view,delはワイルドカードも使えます。
// ※区切り記号は、空白、タブの他に'|'も使えます。
// 例:
// cmd(\"commandname args");
// マクロ"commandname.cmd_main"を引数argsを持って呼び出す。
// 参考:lha.c
int n = 0;
if (szcommand) {
mchar *pcmd = strGetWordTop(szcommand);
int lchcmd = strGetWordLen(pcmd);
int cmd = 0;
if (lchcmd) {
mchar *p = pcmd + lchcmd;
mchar szcmd[CCHWORD];
PMACROFUNC func;
strcpy(szcmd,"cmd_");
mcharcpy(szcmd + 4,pcmd,lchcmd);
szcmd[4 + lchcmd] = 0;
mchar *szext = pathGetExt(szcmd);
if (
!stricmp(szext,".exe") ||
!stricmp(szext,".pif")//1.00C PIFも起動できるように
) {
WinExec(szcommand,SW_SHOW);
return 1;
} else if (!stricmp(szext,".txe")) {//1.00C TXEも起動できるように
//1.00H2
wzExec(szcommand);
return 1;
} else if (macroGetFuncAddress(szcmd,&func)) {
// このマクロ内に関数"cmd_コマンド名"があればそれを実行
DWORD ret = 0;
macroCallAddress(&func,&ret,1,p);
return ret;
} else {
// このマクロ内になければ"コマンド名.cmd_main"を実行
DWORD ret = 0;
mcharcpy(szcmd,pcmd,lchcmd);
strcpy(szcmd+lchcmd,".cmd_main");
macroCall(szcmd,&ret,1,p);
return ret;
}
}
}
return n;
}
//{###コマンドライン}
BOOL TXAPI exec(LPBYTE szcmd)
{
// szcmdのコマンドラインを実行します。
// 例:exec("wz.exe filer.txe"); // WZ Filerを起動
if (WinExec(szcmd,SW_SHOW) < 32) {
return FALSE;
}
return TRUE;
}