📄 shfileop.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 + -