C#IFileOperation如何获取所有操作的状态和错误信息

本文关键字:操作 状态 信息 错误 何获取 获取 C#IFileOperation | 更新日期: 2023-09-27 18:27:53

我想在我的.NET C#应用程序中使用IFileOperation。

我找到了这篇文章http://blogs.msdn.com/b/msdnmagazine/archive/2007/12/12/6738569.aspx(此处提供源代码http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/NetMatters2007_12.exe)。到目前为止,它运行良好,但我想获得所有操作的状态和错误信息。

有一行代码:

if (_callbackSink != null) _sinkCookie = _fileOperation.Advise(_callbackSink);

这应该允许我访问这些信息,但我不知道如何使用它。

这就是我的调用方式,我想在fileOp.PerformOperations()之后得到一些带有结果的操作列表;类似于:

File/Folder name | Action | Result 
d:'test'      | Copy | OK
d:'test'a.jpg | Copy | OK
d:'test'b.jpg | Copy | CALCELED
using (FileOperation fileOp = new FileOperation(new FileOperationProgressSink(), this)) {
  fileOp.CopyItem(source, destination, name);
  fileOp.PerformOperations();
}

我知道我可以在FileOperationProgressSink.PostCopyItem中获得这些信息,但我需要在FileOperation类中全部获得,这样我就可以像fileOp.ResultData[]一样访问它们。

有人能帮我吗?

C#IFileOperation如何获取所有操作的状态和错误信息

我想明白了。

这是我的FileOperationProgressSink类,它将源文件路径和新创建的文件路径添加到Application.Current.Properties.中的字典中

using System.Collections.Generic;
using System.Windows;
using PictureManager.ShellStuff.Interfaces;
namespace PictureManager.ShellStuff {
  public class PicFileOperationProgressSink: FileOperationProgressSink {
    public override void PostCopyItem(uint dwFlags, IShellItem psiItem, IShellItem psiDestinationFolder, string pszNewName, uint hrCopy, IShellItem psiNewlyCreated) {
      if (hrCopy != 0) return;
      ((Dictionary<string, string>)Application.Current.Properties["FileOperationResult"]).Add(
        psiItem.GetDisplayName(SIGDN.SIGDN_FILESYSPATH), 
        psiNewlyCreated.GetDisplayName(SIGDN.SIGDN_FILESYSPATH));
    }
  }
}

这是FileOperation 的用法

private void CmdTestButton(object sender, ExecutedRoutedEventArgs e) {
  Application.Current.Properties["FileOperationResult"] = new Dictionary<string, string>();
  using (FileOperation fo = new FileOperation(new PicFileOperationProgressSink())) {
    fo.CopyItem(@"d:'!test'003.jpg", @"d:'!test'aaa", "003.jpg");
    fo.PerformOperations();
  }
  var fileOperationResult = (Dictionary<string, string>) Application.Current.Properties["FileOperationResult"];
}

然后我可以比较输入/输出文件路径并确定发生了什么。

相关文章: