荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 自 编 删 除 目 录 及 其 下 属 文 件 的 函 数
发信站: 荔园晨风BBS站 (Wed Jun  6 07:23:03 2001), 转信

高 版 本 的MS-DOS 和Windows 95 都 提 供 了 一 个 可 以 删 除 一 个 或 多 个
 目 录 及 其 下 属 文 件 和 目 录 的 命 令, 即DeleteTree 命 令。 然 而, 无
 论 在MFC 类 库 还 是 在Win32 函 数 库 中, 都 没 有 相 应 的 函 数 与 之 对
 应。 这 样, 当 我 们 在 自 己 设 计 的 应 用 程 序 中 需 要 用 到DeleteTre
e 的 功 能 时, 自 然 想 到 的 方 法 是 通 过 进 程 调 用 或 者 系 统 调 用
的 方 式( 正 如 上 面 部 分 所 述 的 那 样) 调 用MD-DOS 或Windows 95 下 的De
leteTree 命 令。 然 而,Win32 函 数 库 已 经 为 我 们 提 供 了 多 种 用 于 文
 件 和 目 录 操 作 的 函 数, 利 用 它 们 不 难 设 计 出 自 己 的DeleteTree(
) 函 数。

---- 读 者 读 到 这 里, 也 许 会 感 到 有 些 疑 惑, 为 什 么 第 六 部 分 强
 调 进 程 调 用 优 于 自 我 设 计 的 函 数, 而 这 一 部 分 又 反 了 过 来 ?
 是 的, 在 通 常 情 况 下, 调 用 应 用 程 序 内 部 的 函 数 比 使 用 进 程
 或 者 调 用 外 部 函 数 更 灵 活 并 且 可 以 提 高 执 行 效 率, 也 便 于 修
 改。 所 以, 象DeleteTree() 这 样 的 功 能, 利 用 现 有 的 函 数 并 不 难
实 现, 自 然 就 最 好 通 过 内 部 函 数 的 方 式 来 完 成。 然 而, 象 设 计
 一 个 压 缩/ 解 压 缩 这 样 的 函 数 的 工 作 量, 并 不 比 通 过 进 程 调
用 来 使 用 现 成 品 的 开 销 更 合 算, 因 为 它 至 少 需 要 我 们 了 解 压
 缩/ 解 压 缩 的 复 杂 算 法, 而 且 调 试 和 维 护 它 也 需 要 一 定 代 价。
 于 是, 这 个 时 候, 还 是 采 用“ 拿 来 主 义” 为 好。
---- 下 面, 给 出 我 自 己 设 计 的DeleteTree() 函 数, 仅 供 参 考。
BOOL DeleteTree(CString DirName)
{ //成功:返回TRUE;否则,返回FALSE
BOOL Result;
Result=PreRemoveDirectory(DirName)
&& RemoveDirectory(DirName);
return Result;
}
BOOL PreRemoveDirectory(CString DirName)
{//成功:返回TRUE;否则,返回FALSE
LPTSTR lpBuffer;
UINT uSize;
CString fileName;
HANDLE hHeap;
BOOL result;
HANDLE hFindFile;
WIN32_FIND_DATA FindFileData;
uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR);
hHeap=GetProcessHeap();
lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize);
GetCurrentDirectory(uSize,lpBuffer);
if (lpBuffer!=DirName) {//调整当前目录
SetCurrentDirectory(DirName);
}
hFindFile=FindFirstFile("*.*",&FindFileData);
CString tFile;
if (hFindFile!=INVALID_HANDLE_VALUE) {
do {
tFile=FindFileData.cFileName;
if ((tFile==".")||(tFile=="..")) continue;
if (FindFileData.dwFileAttributes==
FILE_ATTRIBUTE_DIRECTORY){
if (DirName[DirName.GetLength()-1]!='\\')
PreRemoveDirectory(DirName+'\\'+tFile);
else
PreRemoveDirectory(DirName+tFile);
if (!RemoveDirectory(tFile))
result=FALSE;
else
result=TRUE;
}
else
if (!DeleteFile(tFile)) result=FALSE;
else result=TRUE;
}
while (FindNextFile(hFindFile,&FindFileData));
FindClose(hFindFile);
}
else {
SetCurrentDirectory(lpBuffer);
return FALSE;
}
SetCurrentDirectory(lpBuffer); //回复到原来的目录下
return result;
}

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店