说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何把文件删除到回收站?

编辑:说三道四文库 发布时间:2018-06-24 04:09
HTML文档下载 WORD文档下载 PDF文档下载
简单问题,BCB中,如何把文件删除到回收站?另外,BCB中在windows下的复制、移动用什么汉书?
http://www.china-askpro.com/msg26/qa94.shtml
如 何 在 程 序 中 把 文 件 送 入 回 收 站 

--------------------------------------------------------------------------------

---- 在WINDOWS95/98 中 删 除、 拷 贝、 移 动 文 件 时, 屏 幕 上 就 会 很 形 象 地 显 示 文 件 的 运 动 过 程, 如 删 除 文 件 时 屏 幕 上 出 现 文 件 丢 进 回 收 站 的 情 形。 这 样 使 操 作 看 起 来 非 常 形 象, 增 强 了 形 象 性 和 趣 味 性。 那 么 我 们 能 否 在 自 己 的 应 用 程 序 中 实 现 这 一 操 作 呢 ? 答 案 是 肯 定 的, 那 么 怎 样 来 实 现 呢 ? 

---- 有 一 个WIN API 为 我 们 提 供 了 方 法, 它 就 是: 

WINSHELLAPI int WINAPI SHFileOperation
( LPSHFILEOPSTRUCT  lpFileOp );

---- 其 中SHFileOperation 是 函 数 名,lpFileOp 为 函 数 参 数, 它 是 一 个 指 向SHFILEOPSTRUCT 
---- 结 构 的 指 针。SHFILEOPSTRUCT 结 构 如 下: 

typedef struct _SHFILEOPSTRUCT
{
HWND          hwnd;
UINT            wFunc; 
LPCSTR         pFrom;
LPCSTR         pTo;   
FILEOP_FLAGS  fFlags; 
BOOL           fAnyOperationsAborted;
LPVOID         hNameMappings; 
LPCSTR         lpszProgressTitle;
 } SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

---- 其 中hwnd 为 当 前 窗 口 的 句 柄。wFunc 为 所 要 进 行 的 操 作, 共 有 四 种:FO_DELET 删 除 文 件, 
---- FO_COPY 拷 贝 文 件, FO_MOVE 移 动 文 件, FO_RENAME 文 件 改 名。pFrom 为 源 文 件 名 列 表, 必 需 以'\0' 分 隔 各 个 文 件 名, 且 以'\0\0' 结 束。PTo 为 目 的 文 件 名 列 表 必 需 以'\0' 分 隔 各 个 文 件 名, 且 以'\0\0' 结 束, 当 操 作 为FO_DELET 时 被 忽 略。FFlags 操 作 性 质, 如FOF_ALLOWUNDO 为 充 许 撤 消 操 作。 还 有 几 个 成 员 因 为 与 本 文 无 关 则 不 进 行 详 细 讨 论. 

---- 这 样 我 们 只 要 把wFunc 设 置 为FO_DELET, 把fFlags 设 置 为FOF_ALLOWUNDO, 把pFrom 设 置 为 要 删 除 的 文 件 列 表, 就 可 以 实 现 把 文 件 送 入 回 收 站。 以C++Builder 为 例: 

在C++Builder 的IDE 环 境 中 选 取File/New Application 菜 单, 出 现Form1 窗 口。 

在Object Inspector 窗 口 中 选 择Caption 项, 改Form1 为 练 习。 

在 控 件 栏 中 选 取Standard 页, 在 该 页 中 单 击Button 按 钮。 

在Form1 窗 口 中 单 击 鼠 标 左 键,Form1 窗 口 中 出 现Button1 按 钮。 

在Object Inspector 窗 口 中 选 择Caption 项, 改Button1 为 测 试。 

在 控 件 栏 中 选 取Dialogs 页, 在 该 页 中 单 击OpenDialog 按 钮。 

在Form1 窗 口 中 单 击 鼠 标 左 键,Form1 窗 口 中 出 现OpenDialog1 图 标。 

在Object Inspector 窗 口 中 选 择+Options 项, 然 后 双 击 打 开 列 表, 在 列 表 中 选ofAllowMultiSelect 属 性, 改 属 性false 为true; 即 在 打 开 文 件 对 话 框 中 充 许 同 时 选 择 多 个 文 件。 

在Form1 窗 口 中 选 取“ 测 试” 按 钮, 然 后 出 现Unit1.cpp 代 码 窗 口。 在 其 中 填 入 以 下 代 码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HLOCAL hData;
  LPCSTR APath;
  int sLen,i=0;
  char * sp, *nsp;
  SHFILEOPSTRUCT lpFileOp;

  if (OpenDialog1->Execute())
  {
   sp=OpenDialog1->Files->GetText();
   sLen=lstrlen(sp);
   hData=LocalAlloc(LMEM_MOVEABLE,sLen);
   if(hData)
   {
     nsp=(char *)LocalLock(hData);
     ZeroMemory(nsp,sLen);
     APath=nsp;

     while (iHandle;
     lpFileOp.wFunc=FO_DELETE;
     lpFileOp.pFrom=APath;
     lpFileOp.pTo=NULL;
     lpFileOp.fFlags=FOF_ALLOWUNDO;
     lpFileOp.fAnyOperationsAborted=true;
     lpFileOp.hNameMappings=NULL;
     lpFileOp.lpszProgressTitle=NULL;

     if (!SHFileOperation(&lpFileOp))
     {
       Application->MessageBox("SHFileOperation 
     操作成功!"," 确认",MB_OK);
     }
     else
     {
       Application->MessageBox("SHFileOperation
     操作失败!"," 确认",MB_OK);
     }
     LocalUnlock(hData);
     LocalFree(hData);
   }
   else
   {
Application->MessageBox
("分配内存失败!"," 确认",MB_OK);
   }
  }
  else
  {
Application->MessageBox
("没有选择文件!"," 确认",MB_OK);
  }
}
//-------------------------------------------
 其中黑体字为自己输入的代码,其它为
C++Builder自动建立的。并在文件起始处 
#include < vcl.h >之后加上#include < shellapi.h >一句。
其中语句sp=OpenDialog1- >Files- >
GetText();是从打开文件对话框中以文本形式返回
所选择的文件名。每个文件名后自动加上
两个字符'\n\r'即换行,回车.而又因为
SHFILEOPSTRUCT结构中的成员pFrom的格式为:
文件名列表以'\0'分隔,以'\0\0'结尾,所以用
     while (I < sLen)
     {
      switch(*sp)
      {
       case  ' \n': sp++;break;
       case  ' \r': *nsp='\0';sp++;nsp++;break;
       default   : *nsp=*sp;sp++;nsp++;break;
      }
      i++;
     }

---- 来 构 造, 而 语 句ZeroMemory(nsp,sLen); 对 内 存 清 零 也 是 为 了 这 个 原 因。 
---- 10. 在 代 码 窗 口 中 单 击 鼠 标 右 键, 选 择Open Source/Header File 菜 单, 出 现Unit1.h 

---- 代 码 窗 口, 在 其 中 输 入 以 下 代 码: 

#include < windows.h >

---- 11. 按F9 运 行 即 可。 
---- 如 以test.bpr,testU.cpp 保 存 工 程, 则 以 上 程 序 的 具 体 代 码 如 下 

ex2.cpp
//-------------------------------------------------  
#include 
#pragma hdrstop
USERES("test.res");
USEFORM("TestU.cpp", Form1);
//----------------------------------------------------
WINAPI WinMain(HINSTANCE,
 HINSTANCE, LPSTR, int)
{
    try
    {
        Application- >Initialize();
        Application- >CreateForm(__classid(TForm1), &Form1);
        Application- >Run();
    }
    catch (Exception &exception)
    {
        Application- >ShowException(&exception);
    }
    return 0;
}
//-----------------------------------------------------------

testU.cpp
//-----------------------------------------------------------
#include < vcl.h >
#include < shellapi.h >
#pragma hdrstop

#include "TestU.h"
//-------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//-------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HLOCAL hData;
  LPCSTR APath;
  int sLen,i=0;
  char * sp, *nsp;
  SHFILEOPSTRUCT lpFileOp;

  if (OpenDialog1- >Execute())
  {
   sp=OpenDialog1- >Files- >GetText();
   sLen=lstrlen(sp);
   hData=LocalAlloc(LMEM_MOVEABLE,sLen);
   if(hData)
   {
     nsp=(char *)LocalLock(hData);
     ZeroMemory(nsp,sLen);
     APath=nsp;

     while (i< sLen)
     {
      switch(*sp)
      {
       case  '\n': sp++;break;
       case  '\r': *nsp='\0';sp++;nsp++;break;
       default  : *nsp=*sp;sp++;nsp++;break;
      }
      i++;
     }

     lpFileOp.hwnd=Form1- >Handle;
     lpFileOp.wFunc=FO_DELETE;
     lpFileOp.pFrom=APath;
     lpFileOp.pTo=NULL;
     lpFileOp.fFlags=FOF_ALLOWUNDO;
     lpFileOp.fAnyOperationsAborted=true;
     lpFileOp.hNameMappings=NULL;
     lpFileOp.lpszProgressTitle=NULL;

     if (!SHFileOperation(&lpFileOp))
     {
       Application- >MessageBox("SHFileOperation
操作成功!","确认",MB_OK);
     }
     else
     {
       Application- >MessageBox("SHFileOperation
操作失败!","确认",MB_OK);
     }
     LocalUnlock(hData);
     LocalFree(hData);
   }
   else
   {
Application- >MessageBox
("分配内存失败!","确认",MB_OK);
   }
  }
  else
  {
Application- >MessageBox
("没有选择文件!","确认",MB_OK);
  }
}
//-------------------------------------------------------------------

---- 同 样 我 们 只 要 改 变SHFILEOPSTRUCT 结 构 的wFunc 及 相 应 成 员 就 可 以 实 现 拷 贝、 移 动、 改 名 等 操 作。 如 果 要 对 整 个 目 录 进 行 操 作, 则 只 要 把pForm 设 置 成 目 录 列 表 即 可。 
---- 以 上 程 序 在Windows98,C++Builder 3.0 中 通 过。 
复制文件:CopyFile()函数
移动函数:MoveFile()函数
哈哈,谢了,等会儿我就给分。

拷贝一个目录文件到另一目录,目录可以自己指定或运行时付值。
\\是cb里的路径表示法,只能这样。

AnsiString From=AnsiString("C:\\");
AnsiString To = AnsiString("d:\\");
AnsiString strTemp=From +"*.ini";
LPWIN32_FIND_DATA lpFindFileData = new(WIN32_FIND_DATA);
HANDLE hFindFile=FindFirstFile(strTemp.c_str() ,lpFindFileData);
if(hFindFile!=INVALID_HANDLE_VALUE)
{
do
   {
CopyFile((AnsiString(From)+AnsiString(lpFindFileData->cFileName)).c_str(),
(AnsiString(To)+AnsiString(lpFindFileData->cFileName )) .c_str() ,false);
DeleteFile(AnsiString(From) + AnsiString(lpFindFileData->cFileName));
}
while(FindNextFile(hFindFile,lpFindFileData));
FindClose(hFindFile);
}
delete lpFindFileData;
gz
将文件删除到回收站中
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   TSHFileOpStruct OpStruct;
   char DelFile[128];
   setmem(DelFile, 128, '\0'); // 以双\0字符结束
   StrPCopy(DelFile, Edit1->Text);

   // 设置OpStruct
   OpStruct.hwnd = Handle;
   OpStruct.wFunc = FO_DELETE;
   OpStruct.pFrom = DelFile;
   OpStruct.pTo = NULL;
   OpStruct.fFlags = FOF_ALLOWUNDO;
   OpStruct.hNameMappings = NULL;
   OpStruct.lpszProgressTitle = NULL; 

   SHFileOperation(&OpStruct);
}
mark
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘