⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shfileop.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
字号:
// shfileop.cpp

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include "msc.h"
#include "shfileop.h"



//////////////////////////////
//          ANSI斉          //
//////////////////////////////



// 僔僃儖傪棙梡偟偰暋悢偺僼傽僀儖傪嶍彍偡傞乮ANSI斉乯
// 嶍彍偝傟偨僼傽僀儖偼偛傒敔傊堏摦
// 堷偒悢偱巜掕偝傟傞暥帤楍偵偼丄偝傜偵屻傠偵'\0'傪壛偊傞
// 僼傽僀儖柤偼儚僀儖僪僇乕僪巊梡壜
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellDeleteMultipleFilesA ( HWND hWnd, const char *szFileNameBuffer, int IsNoRecycleBin ) {

   if ( ! szFileNameBuffer ) return 1 ;

   SHFILEOPSTRUCTA ShFileOp = { 0 } ;
   ShFileOp.hwnd = hWnd ;
   ShFileOp.wFunc = FO_DELETE ;
   ShFileOp.pFrom = szFileNameBuffer ;
   ShFileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | ( hWnd ? 0 : FOF_SILENT ) | ( IsNoRecycleBin ? 0 : FOF_ALLOWUNDO ) ;

   return SHFileOperationA ( & ShFileOp ) || ShFileOp.fAnyOperationsAborted ;
}



// 僔僃儖傪棙梡偟偰侾偮偺僼傽僀儖傪嶍彍偡傞乮ANSI斉乯
// 嶍彍偝傟偨僼傽僀儖偼偛傒敔傊堏摦
// 僼傽僀儖柤偼儚僀儖僪僇乕僪巊梡壜
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellDeleteFileA ( HWND hWnd, const char *szFileName, int IsNoRecycleBin ) {

   if ( ! szFileName ) return 1 ;

   char *szFileNameBuffer = strdup_expand ( szFileName, MAX_PATH, 1 ) ; // 枛旜偵 0 傪晅壛偡傞偨傔
   if ( ! szFileNameBuffer ) return 1 ;

   *( strend ( szFileNameBuffer ) + 1 ) = 0 ;

   int nResult = ShellDeleteMultipleFilesA ( hWnd, szFileNameBuffer, IsNoRecycleBin ) ;

   free ( szFileNameBuffer ) ;
   return nResult ;
}



// 僔僃儖傪棙梡偟偰暋悢偺僼傽僀儖傪僐僺乕丒堏摦偡傞乮ANSI斉乯
// 堷偒悢偱巜掕偝傟傞暥帤楍偵偼丄偝傜偵屻傠偵'\0'傪壛偊傞
// 僼傽僀儖柤偼儚僀儖僪僇乕僪巊梡壜
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// szDstDir 偵偼 \ 偱廔傢傞僼僅儖僟柤傪巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellCopyMultipleFilesA ( HWND hWnd, const char *szFileNameBuffer, const char *szDstDir, int IsMove ) {

   if ( ! szFileNameBuffer ) return 1 ;
   if ( ! szDstDir ) return 1 ;

   SHFILEOPSTRUCTA ShFileOp = { 0 } ;
   ShFileOp.hwnd = hWnd ;
   ShFileOp.wFunc = IsMove ? FO_MOVE : FO_COPY ;
   ShFileOp.pFrom = szFileNameBuffer ;
   ShFileOp.pTo = szDstDir ;
   ShFileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | ( hWnd ? 0 : FOF_SILENT ) | FOF_NOCONFIRMMKDIR ;

   return SHFileOperationA ( & ShFileOp ) || ShFileOp.fAnyOperationsAborted ;
}



// 僔僃儖傪棙梡偟偰侾偮偺僼傽僀儖傪僐僺乕丒堏摦偡傞乮ANSI斉乯
// 僼傽僀儖柤偼儚僀儖僪僇乕僪巊梡壜
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// szDstDir 偵偼 \ 偱廔傢傞僼僅儖僟柤傪巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellCopyFileA ( HWND hWnd, const char *szFileName, const char *szDstDir, int IsMove ) {

   if ( ! szFileName ) return 1 ;

   char *szFileNameBuffer = strdup_expand ( szFileName, MAX_PATH, 1 ) ; // 枛旜偵 0 傪晅壛偡傞偨傔
   if ( ! szFileNameBuffer ) return 1 ;

   *( strend ( szFileNameBuffer ) + 1 ) = 0 ;

   int nResult = ShellCopyMultipleFilesA ( hWnd, szFileNameBuffer, szDstDir, IsMove ) ;

   free ( szFileNameBuffer ) ;
   return nResult ;
}



//////////////////////////////
//         UNICODE斉        //
//////////////////////////////



// This function is not supported in Win95
#ifndef NTFUNC_IMPORT_IMPLICITLY
#define SHFileOperationW SHFileOperationW_
typedef int ( WINAPI *SHFILEOPERATIONW ) ( LPSHFILEOPSTRUCTW lpFileOp ) ;
static HINSTANCE hShell32 ;
static SHFILEOPERATIONW SHFileOperationW ;
static int FreeLibraryOnDetach ( void ) ;
#endif



// 僔僃儖傪棙梡偟偰暋悢偺僼傽僀儖傪嶍彍偡傞乮UNICODE斉乯
// 嶍彍偝傟偨僼傽僀儖偼偛傒敔傊堏摦
// 堷偒悢偱巜掕偝傟傞暥帤楍偵偼丄偝傜偵屻傠偵'\0'傪壛偊傞
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellDeleteMultipleFilesW ( HWND hWnd, const wchar_t *szFileNameBuffer, int IsNoRecycleBin ) {

   if ( ! szFileNameBuffer ) return 1 ;

#ifndef NTFUNC_IMPORT_IMPLICITLY
   if ( ! hShell32 && ( hShell32 = LoadLibraryW ( L"SHELL32.DLL" ) ) ) FreeLibraryOnDetach () ;
   if ( GETPROCADDRESS ( hShell32, SHFILEOPERATIONW, SHFileOperationW ) ) return 1 ;
#endif

   SHFILEOPSTRUCTW ShFileOp = { 0 } ;
   ShFileOp.hwnd = hWnd ;
   ShFileOp.wFunc = FO_DELETE ;
   ShFileOp.pFrom = szFileNameBuffer ;
   ShFileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | ( hWnd ? 0 : FOF_SILENT ) | ( IsNoRecycleBin ? 0 : FOF_ALLOWUNDO ) ;

   return SHFileOperationW ( & ShFileOp ) || ShFileOp.fAnyOperationsAborted ;
}



// 僔僃儖傪棙梡偟偰侾偮偺僼傽僀儖傪嶍彍偡傞乮UNICODE斉乯
// 嶍彍偝傟偨僼傽僀儖偼偛傒敔傊堏摦
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellDeleteFileW ( HWND hWnd, const wchar_t *szFileName, int IsNoRecycleBin ) {

   if ( ! szFileName ) return 1 ;

   wchar_t *szFileNameBuffer = wcsdup_expand ( szFileName, MAX_LONG_PATH, 1 ) ;  // 枛旜偵 0 傪晅壛偡傞偨傔
   if ( ! szFileNameBuffer ) return 1 ;

   *( wcsend ( szFileNameBuffer ) + 1 ) = 0 ;

   int nResult = ShellDeleteMultipleFilesW ( hWnd, szFileNameBuffer, IsNoRecycleBin ) ;

   free ( szFileNameBuffer ) ;
   return nResult ;
}



// 僔僃儖傪棙梡偟偰暋悢偺僼傽僀儖傪僐僺乕丒堏摦偡傞乮ANSI斉乯
// 堷偒悢偱巜掕偝傟傞暥帤楍偵偼丄偝傜偵屻傠偵'\0'傪壛偊傞
// 僼傽僀儖柤偼儚僀儖僪僇乕僪巊梡壜
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// szDstDir 偵偼 \ 偱廔傢傞僼僅儖僟柤傪巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellCopyMultipleFilesW ( HWND hWnd, const wchar_t *szFileNameBuffer, const wchar_t *szDstDir, int IsMove ) {

   if ( ! szFileNameBuffer ) return 1 ;
   if ( ! szDstDir ) return 1 ;

#ifndef NTFUNC_IMPORT_IMPLICITLY
   if ( ! hShell32 && ( hShell32 = LoadLibraryW ( L"SHELL32.DLL" ) ) ) FreeLibraryOnDetach () ;
   if ( GETPROCADDRESS ( hShell32, SHFILEOPERATIONW, SHFileOperationW ) ) return 1 ;
#endif

   SHFILEOPSTRUCTW ShFileOp = { 0 } ;
   ShFileOp.hwnd = hWnd ;
   ShFileOp.wFunc = IsMove ? FO_MOVE : FO_COPY ;
   ShFileOp.pFrom = szFileNameBuffer ;
   ShFileOp.pTo = szDstDir ;
   ShFileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | ( hWnd ? 0 : FOF_SILENT ) | FOF_NOCONFIRMMKDIR ;

   return SHFileOperationW ( & ShFileOp ) || ShFileOp.fAnyOperationsAborted ;
}



// 僔僃儖傪棙梡偟偰侾偮偺僼傽僀儖傪僐僺乕丒堏摦偡傞乮ANSI斉乯
// 僼傽僀儖柤偼儚僀儖僪僇乕僪巊梡壜
// 僼傽僀儖柤偼僼儖僷僗柤偱巜掕
// szDstDir 偵偼 \ 偱廔傢傞僼僅儖僟柤傪巜掕
// hWnd 偵 NULL 傪巜掕偡傞偲丄僾儘僌儗僗僟僀傾儘僌傪昞帵偟側偄
// 惉岟偡傟偽 0 傪丄幐攕偡傟偽偦傟埲奜傪曉偡
int ShellCopyFileW ( HWND hWnd, const wchar_t *szFileName, const wchar_t *szDstDir, int IsMove ) {

   if ( ! szFileName ) return 1 ;

   wchar_t *szFileNameBuffer = wcsdup_expand ( szFileName, MAX_LONG_PATH, 1 ) ;  // 枛旜偵 0 傪晅壛偡傞偨傔
   if ( ! szFileNameBuffer ) return 1 ;

   *( wcsend ( szFileNameBuffer ) + 1 ) = 0 ;

   int nResult = ShellCopyMultipleFilesW ( hWnd, szFileNameBuffer, szDstDir, IsMove ) ;

   free ( szFileNameBuffer ) ;
   return nResult ;
}



#ifndef NTFUNC_IMPORT_IMPLICITLY
static void __cdecl ExitProc ( void ) {
   if ( hShell32 ) FreeLibrary ( hShell32 ) ;
   hShell32 = NULL ;
}
#endif



#ifndef NTFUNC_IMPORT_IMPLICITLY
static int FreeLibraryOnDetach ( void ) {
#ifdef _USRDLL
   return atexit ( ExitProc ) ;
#else
   return 0 ;
#endif
}
#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -