SHFileOperationA 函数 (shellapi.h)
发布时间:2026-08-19 | 浏览:1
访问此页面需要授权。 可以尝试 登录 或 更改目录 。
访问此页面需要授权。 可以尝试 更改目录 。
复制、移动、重命名或删除文件系统对象。 此函数已在 Windows Vista 中替换为 IFileOperation 。
[in, out] lpFileOp
类型: LPSHFILEOPSTRUCT
指向 SHFILEOPSTRUCT 结构的指针,该结构包含此函数执行指定操作所需的信息。 此参数必须包含无效值,该值不 NULL 。 你负责验证该值。 如果未验证,将遇到意外结果。
如果成功,则返回零;否则为非零。 应用程序通常应只检查零个或非零。
最好检查 SHFILEOPSTRUCT 的 fAnyOperationsAborted 成员的值。 如果用户取消操作,则 SHFileOperation 可以返回 0 以成功。 如果不检查 fAnyOperationsAborted 以及返回值,则无法知道该函数完成了你要求的完整任务,并且可能会继续执行不正确的假设。
不要将 GetLastError 用于此函数的返回值。
为了检查非零值以进行故障排除,它们主要映射到 Winerror.h 中定义的值。 但是,它的几个可能的返回值基于预 Win32 错误代码,在某些情况下,它重叠后面的 Winerror.h 值而不匹配其含义。 此处详细介绍了这些特定值,这些特定值的 仅 这些含义应通过 Winerror.h 代码接受。 但是,这些值随以下警告一起提供:
这些代码是预 Win32 错误代码,在任何公共头文件中不再受支持或定义。 若要使用它们,必须自行定义它们或与数值进行比较。
这些错误代码可能会更改,并且以前已执行此操作。
这些值仅作为调试方面的帮助提供。 不应将其视为明确的。
应使用此函数的完全限定路径名称。 将它与相对路径名称一起使用不是线程安全的。
除了两个例外,不能使用 SHFileOperation 通过指定网络路径将特殊文件夹从本地驱动器移动到远程计算机。 例外情况是“我的文档” ( CSIDL_PERSONAL 、 CSIDL_DOCUMENTS )和 “我的图片” 文件夹( CSIDL_MYPICTURES )。
用于删除文件时, SHFileOperation 永久删除该文件,除非在由 lpFileOp 指向的 SHFILEOPSTRU CT 成员的 fFlags 成员中设置 FOF_ALLOWUNDO 标志。 设置该标志会将文件发送到回收站。 如果只想删除文件并确保它未放置在回收站中,请使用 DeleteFile 。
如果公开并注册了复制回调处理程序, SHFileOperation 调用该处理程序,除非在 fFlags 结构 成员设置标志( FOF_NOCONFIRMATION 如 lpFileOp )。 有关实现复制回调处理程序的详细信息,请参阅 ICopyHook::CopyCallback 。
除非在 lpFileOp 中设置 FOF_NORECURSION 标志,否则文件删除是递归的。
HTML 文件必须具有 .htm 或 .html 扩展名。 通过将包含相关文件的文件夹放置在 HTML 文件所在的同一文件夹中来创建与相关文件的连接。 包含已连接文件的文件夹的名称必须与 HTML 文件的名称相同,后跟“_files”或“.files”(这区分大小写;例如“)。文件“不起作用。 此处提供了一个示例。
在 C:\Files 目录中创建名为 Test.htm 的文件(C:\Files\Test.htm)。
在 C:\Files 目录(C:\Files\Test.files)中创建名为 Test.files 的新文件夹。
使用几个文件填充文件夹。 此文件夹中放置的任何文件都连接到 Test.htm。
将 Test.htm 文件移动或复制到 C:\Files2 目录。
请注意,Test.files 目录现在也位于 C:\Files2 目录中。
默认情况下,文件连接处于启用状态。 可以通过添加 REG_DWORD 条目 NoFileFolderConnection 来禁用它,如下所示:
将 NoFileFolderConnection 设置为 1 会禁用文件连接。 如果该值设置为零或缺失,则启用文件连接。
若要仅移动指定的文件和未移动任何连接的文件,请将 FOF_NO_CONNECTED_ELEMENTS 标志设置为 lpFileOp 指向的结构 成员 标志。
请注意,使用名称为“MyFile_files”的文件夹定义连接可能对 Windows 的本地化版本无效。 术语“files”可能需要用本地语言的等效单词替换。
shellapi.h 标头将 SHFileOperation 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。
想要尝试使用 Ask Learn 阐明或指导你完成本主题?
Last updated on 2024-11-20