如何使用ShFileOperation在Windows中批量操作文件?

作者:荆门麻将开发公司 阅读:33 次 发布时间:2025-07-12 21:03:10

摘要:在Windows中,一些文件操作可能需要我们逐个文件进行处理,这无疑会浪费大量的时间和精力,同时也会增加出错的风险。此时,使用ShFileOperation可以帮助我们批量操作文件,提高效率和准确性。本文将介绍如何使用ShFileOperation在Windows中进行批量操作文件。一、ShFileOpera...

在Windows中,一些文件操作可能需要我们逐个文件进行处理,这无疑会浪费大量的时间和精力,同时也会增加出错的风险。此时,使用ShFileOperation可以帮助我们批量操作文件,提高效率和准确性。本文将介绍如何使用ShFileOperation在Windows中进行批量操作文件。

如何使用ShFileOperation在Windows中批量操作文件?

一、ShFileOperation 简介

ShFileOperation是Windows API中的一个文件操作函数,可以对文件和文件夹进行操作,例如复制、移动、删除、新建等。ShFileOperation可以在后台操作,也可以展示一个进度对话框,让用户了解操作进度。

二、ShFileOperation 的使用

ShFileOperation的使用有以下几个步骤:

1、打开操作组(Operation Group)

在使用ShFileOperation之前,我们需要开启一个操作组。操作组是一个标准结构,用于标识要进行的操作,同时还可以包含一些其他的操作选项。

下面是一个打开操作组的示例代码:

```C++

SHFILEOPSTRUCT file_op;

memset(&file_op, 0, sizeof(file_op));

file_op.hwnd = NULL;

file_op.wFunc = FO_COPY;

file_op.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;

```

在上面的代码中,我们设置了FO_COPY作为操作标识符,并启用了FOF_ALLOWUNDO、FOF_NOCONFIRMATION、FOF_NOERRORUI和FOF_SILENT选项。

2、设置源文件和目标文件

在ShFileOperation中,我们需要设置源文件和目标文件路径。在这里,我们可以使用双重空零字符结尾的字符串列表来表示多个文件。

下面是一个设置源文件和目标文件示例代码:

```C++

// Source and destination files list

char szFrom[] = "C:\\Temp\\test1.txt\0C:\\Temp\\test2.txt\0\0";

char szTo[] = "C:\\Temp\\test3.txt\0C:\\Temp\\test4.txt\0\0";

// Set source and destination files

file_op.pFrom = szFrom;

file_op.pTo = szTo;

```

在上述代码中,我们设置了两个字符串列表,一个表示源文件路径,一个表示目标文件路径。

3、执行操作

在设置了操作组和源文件目标文件之后,我们就可以执行操作了。ShFileOperation提供了两种操作方式:同步和异步。

同步操作方式:

```C++

int result = SHFileOperation(&file_op);

```

异步操作方式:

```C++

HANDLE result = SHFileOperationAsync(&file_op);

```

在上述代码中,我们调用了SHFileOperation函数和SHFileOperationAsync函数来分别进行同步和异步操作。

4、处理操作返回结果

无论是同步操作还是异步操作,我们都需要处理操作的结果。在ShFileOperation中,结果码存储在file_op结构体的fAnyOperationsAborted字段中。如果该字段为TRUE,则操作被取消或发生错误。在这种情况下,我们可以使用GetLastError函数来获取更详细的错误信息。

下面是一个处理操作返回结果示例代码:

```C++

int result = SHFileOperation(&file_op);

if (result != 0 || file_op.fAnyOperationsAborted)

{

UINT error = GetLastError();

wchar_t errorMessage[MAX_PATH];

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,

NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), errorMessage, MAX_PATH, NULL);

wcout << errorMessage << std::endl;

}

else

{

wcout << L"File operation completed successfully!" << endl;

}

```

在上述代码中,我们首先检查结果码和fAnyOperationsAborted字段,如果操作失败,则使用GetLastError函数获取错误信息。否则,打印一条成功的消息。

三、ShFileOperation 批量操作示例

下面是一个通过ShFileOperation批量处理文件的示例,可以复制多个源文件到多个目标文件夹。在这个例子中,我们使用了FO_COPY标识符,启用了多个选项,并且使用NULL来禁用进度对话框。

```C++

//Set operation group

SHFILEOPSTRUCT file_op;

memset(&file_op, 0, sizeof(file_op));

file_op.hwnd = NULL;

file_op.wFunc = FO_COPY;

file_op.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;

//Multi-source and multi-destination files list

char szFrom[] = "C:\\Temp\\test1.txt\0C:\\Temp\\test2.txt\0\0";

char szTo[] = "C:\\Temp\\backup1\\\0C:\\Temp\\backup2\\\0\0";

//Set source and destination files

file_op.pFrom = szFrom;

file_op.pTo = szTo;

//Execute operation

int result = SHFileOperation(&file_op);

//Check results

if (result != 0 || file_op.fAnyOperationsAborted)

{

UINT error = GetLastError();

wchar_t errorMessage[MAX_PATH];

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,

NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), errorMessage, MAX_PATH, NULL);

wcout << errorMessage << std::endl;

}

else

{

wcout << L"File operation completed successfully!" << endl;

}

```

在这个示例中,我们设置了两个源文件(test1.txt和test2.txt)和两个目标文件夹(backup1和backup2),并执行了FO_COPY操作。我们还使用FOF_ALLOWUNDO、FOF_NOCONFIRMATION、FOF_NOERRORUI和FOF_SILENT选项来启用操作。最后,我们检查操作的结果码和fAnyOperationsAborted字段来确定操作是否成功。

四、总结

ShFileOperation是Windows API中对文件和文件夹进行操作的一个函数,可以批量操作文件并提高效率。在使用ShFileOperation之前,我们需要设置操作选项、源文件路径和目标文件路径,并能够根据操作是否成功来执行相应的逻辑处理。在日常开发工作中,熟练掌握ShFileOperation的使用,可以大大提升我们的效率和准确性。

  • 原标题:如何使用ShFileOperation在Windows中批量操作文件?

  • 本文链接:https://qipaikaifa.cn/zxzx/18884.html

  • 本文由深圳中天华智网小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与中天华智网联系删除。
  • 微信二维码

    ZTHZ2028

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:157-1842-0347


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部