【问题标题】:Allow User to Delete File In Use By My Application?允许用户删除我的应用程序正在使用的文件?
【发布时间】:2013-01-02 19:28:43
【问题描述】:

我可以允许用户在 Windows 下删除我的应用程序正在使用的文件吗?

在我的场景中,我有一个由我的应用程序监控的“快速添加”目录。当它看到新图像出现时,它会创建一张新幻灯片以在自动幻灯片放映中显示。我还想允许我的用户从我的“快速添加”目录中删除(和/或重命名)一个文件,并将其从幻灯片中删除。

有没有一种方法可以标记文件,通知 Windows 我可以在我的应用程序使用它时删除该文件?

【问题讨论】:

  • 您的用户是通过 UI 还是手动从文件夹中删除/重命名文件?
  • 他们会从文件夹中进行操作。因此,例如,某人只需将文件拖放到目录中,就可以通过网络推送新图像。

标签: c# wpf windows filesystems


【解决方案1】:

有没有一种方法可以标记文件,通知 Windows 我可以在我的应用程序使用它时删除该文件?

是的。在 Win32 中,这是 dwShareMode 传递给 CreateFile()。这是您希望允许另一个进程执行的操作的位域。您正在寻找的位是FILE_SHARE_DELETE,它允许在打开时删除或重命名。但是,对于最礼貌的行为,我建议包括所有 3 个,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE[1]

由于您询问的是 C# 而不是 Win32,因此在 .NET 世界中,这些都包含在 FileShare 枚举中,您可以在打开文件时传递该枚举,例如。在File.Open

请注意,这些标志不允许您在按名称打开文件时重命名文件的父目录。由于内核中的限制(技术上在 ntfs.sys IIRC 中),无论共享如何,这都会失败。


脚注

1:编辑评论:很遗憾,传递0(许多人不假思索地这样做)恰好是最不被允许的选择,或者更多在 Windows 上编写代码的人没有意识到这是什么参数做并传递这三个标志。

【讨论】:

  • 听起来很完美。我没有提到文件是通过Image 对象的Source 属性打开的——我只是传递了完整的路径字符串。传递图像路径字符串时,有没有办法将此标志发送到Image 标记?谢谢!
  • @EvilClosetMonkey - 我不知道,但有一个想法:致电File.Open 获取Stream,然后将ImageImageSource 设置为此设置属性:msdn.microsoft.com/en-us/library/… - 一定要在某个时候关闭文件。
  • 会试一试。谢谢!
【解决方案2】:

如果您在使用该文件的控件上调用Delete()Rename() 方法,您可以在它删除或重命名文件之前将其从 PictureBox 中删除。

做倍数应该没什么问题。使用控件上的复选框,您只需检查每个控件以查看该属性是否为真,然后调用相应的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 2022-10-13
    • 2014-01-05
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多