0

我编写了一个片段代码,用于删除 SHFileOperation 方法中的指定目录。

pinvoke.net中的 SHFileOperation 类

流动的是我的测试代码:

 var interop = new InteropSHFileOperation();
 interop.wFunc = InteropSHFileOperation.FO_Func.FO_DELETE;
 interop.pFrom = path;
 interop.fFlags.FOF_SILENT = true;
 interop.fFlags.FOF_NOERRORUI = true;
 interop.fFlags.FOF_NOCONFIRMATION = true;
 return interop.Execute();          

上面的代码可以在我的电脑上运行(win7,32-bit,.net 4.0),

但是当将上面的代码运行到我的另一台计算机(win 2008,64-bit,.net 4.0)时,我得到了流动错误(来自 Windows 事件查看器):

Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
   at Shopbots.IO.InteropSHFileOperation.SHFileOperation(SHFILEOPSTRUCT ByRef)
   at Shopbots.IO.InteropSHFileOperation.SHFileOperation(SHFILEOPSTRUCT ByRef)
   at Shopbots.IO.InteropSHFileOperation.Execute()

并从 Windows exceton 对话框

event name : APPCRASH
Fault Module Name:  shell32.dll
Fault Module Version:   6.0.6002.18646
Fault Module Timestamp: 4fd23d65
Exception Code: c0000005

[更新 2]

根据“不要为 Pack 大小声明值。如果省略它,则在编组时使用正确的值,并且单个 SHFILEOPSTRUCT 可用于 32 位和 64 位操作。 ”来自另一篇文章:http ://www.pinvoke.net/default.aspx/Structures/SHFILEOPSTRUCT.html

更改 SHFILEOPSTRUCT 声明工作 32 位和 64 位 Windows 操作系统(因为来自 pinvoke 站点的 InteropSHFileOperation 类声明了 32 位操作系统的 SHFILEOPSTRUCT 结构)

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
struct SHFILEOPSTRUCT
{
  ....
}
4

1 回答 1

1

最常见的故障模式SHFileOperation是路径需要双空终止。我怀疑你忘记了这样做,如果你这样做了,访问冲突是一种可能的结果。

至于结构的包装,它是一个标准的 Win32 结构。它没有打包,它是对齐的。从属性中删除Pack参数。StructLayout

我不明白你为什么不打电话FileSystem.DeleteDirectory

于 2013-07-15T07:15:03.020 回答