vc 支持通配符的文件刪除

利用SHFileOperation實現支持通配符*,?的文件刪除、拷貝、移動等。在vc6.0下測試通過。

//------------------------------------------------------------------------------
//刪除某目錄下的文件,不刪除子目錄文件,不放回回收站,支持通配符*、?,例如:SH_DeleteFileOrDirectory("c:\\data\\1??.*");
//刪除所有文件夾及文件,不放回回收站,例如:SH_DeleteFileOrDirectory("c:\\data");
bool SH_DeleteFileOrDirectory(char *strFileName)
{
    int nLength = strlen(strFileName);
    char *strSrc = new char[nLength+2];
    strcpy(strSrc,strFileName);
    strSrc[nLength+1] = '\0';

    SHFILEOPSTRUCT FileOp={0};
    FileOp.hwnd=NULL;
    FileOp.wFunc=FO_DELETE; 
    FileOp.pFrom=strSrc;
    FileOp.pTo=NULL;
    FileOp.fFlags=FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;//不確認,沒有錯誤提示,不顯示進度對話框
    //FOF_ALLOWUNDO  //允許放回回收站
    FileOp.hNameMappings=NULL;
    FileOp.lpszProgressTitle=NULL;
    bool ret = SHFileOperation(&FileOp) == 0;   
    delete []strSrc;

    return ret;
}
//------------------------------------------------------------------------------
//拷貝所有文件和文件夾,例如:SH_CopyFileOrDirectory("d:\\data","c:\\data);
//拷貝某目錄下的文件,支持通配符*、?,例如:SH_CopyFileOrDirectory("c:\\data\\1??.*","d:\\data");
bool SH_CopyFileOrDirectory(char *pFrom, char *pTo)
{
    int LenFrom=strlen(pFrom);
    int LenTo  =strlen(pTo);

    char *FromBuf = new char[LenFrom+2];
    char *ToBuf   = new char[LenTo+2];

    strcpy(FromBuf,pFrom);
    strcpy(ToBuf,pTo);
    FromBuf[LenFrom+1]=0;
    ToBuf[LenTo+1]=0;

    SHFILEOPSTRUCT FileOp={0}; 
    FileOp.fFlags = FOF_NOCONFIRMATION |   //不出現確認對話框
        FOF_NOCONFIRMMKDIR ; //需要時直接創建一個文件夾,不需用戶確定
    FileOp.pFrom = FromBuf; 
    FileOp.pTo = ToBuf; 
    FileOp.wFunc = FO_COPY; 
    bool ret = SHFileOperation(&FileOp) == 0;   
    delete[] FromBuf;
    delete[] ToBuf;

    return ret;   
}
//------------------------------------------------------------------------------
//移動所有文件及文件夾,例如:SH_MoveFileOrDirectory("d:\\data","c:\\data);
//移動某目錄下的文件,支持通配符*、?,例如:SH_MoveFileOrDirectory("c:\\data\\1??.*","d:\\data");
bool SH_MoveFileOrDirectory(char *pFrom, char *pTo)
{
    int LenFrom=strlen(pFrom);
    int LenTo  =strlen(pTo);

    char *FromBuf = new char[LenFrom+2];
    char *ToBuf   = new char[LenTo+2];

    strcpy(FromBuf,pFrom);
    strcpy(ToBuf,pTo);
    FromBuf[LenFrom+1]=0;
    ToBuf[LenTo+1]=0;

    SHFILEOPSTRUCT FileOp={0}; 
    FileOp.fFlags = FOF_NOCONFIRMATION|   //不出現確認對話框 
          FOF_NOCONFIRMMKDIR ; //需要時直接創建一個文件夾,不需用戶確定
    FileOp.pFrom = FromBuf; 
    FileOp.pTo = ToBuf; 
    FileOp.wFunc = FO_MOVE; 
    bool ret = SHFileOperation(&FileOp) == 0;   
    delete[] FromBuf;
    delete[] ToBuf;

    return ret;   
}
//------------------------------------------------------------------------------
//重命名文件或文件夾,不支持通配符,例如:SH_ReNameFile("c:\\data","c:\\data01");
bool SH_ReNameFile(char *pFrom, char *pTo)
{
    int LenFrom=strlen(pFrom);
    int LenTo  =strlen(pTo);

    char *FromBuf = new char[LenFrom+2];
    char *ToBuf   = new char[LenTo+2];

    strcpy(FromBuf,pFrom);
    strcpy(ToBuf,pTo);
    FromBuf[LenFrom+1]=0;
    ToBuf[LenTo+1]=0;

    SHFILEOPSTRUCT FileOp={0}; 
    FileOp.fFlags = FOF_NOCONFIRMATION;   //不出現確認對話框 
    FileOp.pFrom  = FromBuf; 
    FileOp.pTo    = ToBuf; 
    FileOp.wFunc  = FO_RENAME; 
    bool ret = SHFileOperation(&FileOp) == 0;   
    delete[] FromBuf;
    delete[] ToBuf;

    return ret;   
}
//------------------------------------------------------------------------------

參考: VC下的目錄文件的複製.(SHFileOperation)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章