OpenFileDialog()锁定文件夹

5

我在我的Silverlight应用程序中使用OpenFileDialog()。当我使用ShowDialog()选择文件时,它会简单地锁定该文件,直到我关闭应用程序。

当应用程序正在运行(浏览器中的Silverlight应用程序),我无法重命名或删除文件夹。

如果我尝试选择任何其他文件夹中的任何其他文件,则可以重命名先前的文件夹。似乎它正在释放句柄。

我的目标:上传完成后,我想手动重命名/删除文件系统中的文件夹。

我知道不可能从代码中将OpenFileDialog()指向其他文件夹。有什么建议吗?

顺便说一下,这是Windows错误消息:

由于文件夹在另一个程序中打开,因此无法完成操作。关闭文件夹,然后重试。

6个回答

4
我也遇到过同样的问题,下面的方法解决了它。
Stream fileStream = openFileDialog1.OpenFile();
if (fileStream != null)
{
   ...
   fileStream.Close();
}

关闭流之后,我的问题消失了... :P

1
我认为这是正确的答案。在Silverlight中,OFD返回一个打开的文件流,你必须在它被关闭之前关闭它:-)。稍微更好的模式是在try/catch块外声明Stream fileStream,然后将“if (fileStream!= null)...”部分放在finally {}块内。 - Ken Smith

2
using(var fileStream = openFileDialog1.OpenFile())
{
   // do your stuff

}

这将关闭流并解决您的问题。

1

我知道这是一个非常旧的线程,但我也遇到了同样的问题,并在OpenFileDialog中发现了一些奇怪的行为。

问题不在于FileDialog没有正确释放资源或者没有正确处理,而是FileDialog会将当前目录更改为用户选择的目录。

这种情况并不是每次都会发生,但我已经成功地重现了使用ShowHelp属性时的错误(使用.NET Framework 4.7):

var before = Directory.GetCurrentDirectory(); // result: The directory the application started from

using (var fileDialog = new OpenFileDialog()
{
    ShowHelp = true
})
{
    if (fileDialog.ShowDialog() == DialogResult.OK)
    {
        // do something
    }
}

var after = Directory.GetCurrentDirectory(); // result: The directory the user opened the file from

这可能不仅是ShowHelp属性的原因,但这是我能够重现它的方式(而且它确实看起来像一个错误)。

正如Vyacheslav所写,我们可以通过将RestoreDirectory设置为true来避免此行为。


0

将所有持有 OpenFileDialog 引用的变量以及任何 FileInfo 引用都分配为 null,或者在超出范围的代码中,然后尝试以下操作:

GC.Collect();

这是一种非常严厉的做法,我通常不建议这样做。如果它不能解决你的问题,就抛弃它。


0
据我所知,这是Windows文件系统的工作方式 - 当您在文件夹中有一些打开的文件句柄时,您无法重命名该文件夹。在尝试重命名之前,请确保释放文件夹中的所有资源(例如File.Close()等)。

是的,我释放了所有资源。并且重命名文件(甚至所选文件)也不会有任何问题。 - DigitalManic
所有资源,你也要 .Dispose 文件对话框吗?.Close 不足够。 - nos
@nos:通常情况下,对于可处理对象,.Close和.Dispose是同义词,但在这种情况下,OpenFileDialog都没有。 - AnthonyWJones
@AnthonyWJones 如果您正在调用.ShowDialog,则Close和Dispose不是同义词。我假设OP正在使用System.Windows.Forms.OpenFileDialog - 虽然这可能不是Silverlight的情况。 - nos
@nos:不,这是一个Silverlight问题,OpenFileDialog是完全不同的东西。 - AnthonyWJones
SL OpenFileDialog不同。它没有Dispose()或Close()方法。 - DigitalManic

0

这与锁定无关。 - jv42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接