文件信息锁定!

3

想象一下一个Winform应用程序,它会从源文件夹A复制更新的程序集到目标文件夹B。我使用简单的DirectoryInfo.GetFiles方法来填充一个ListView,比较文件夹A和B中程序集的版本;如果有一些程序集是新的,我就开始我的更新方法。在这个方法中,在复制之前,我尝试检查B文件夹中的所有文件是否正在使用:

var B = new DirectoryInfo("myBfolder");
foreach (var file in aFolder.GetFiles())
{
    try
    {
        //File not in use
        File.Open(file.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (Exception ex)
    {
        //File in use!
    }
}

由于之前的UpdateListView代码使用FileInfo获取要显示的信息,导致所有文件都被锁定了!

FileInfo会锁定文件吗?这真的可能吗?

有人能建议一种绕过这个问题的方法吗?

谢谢, Nando


1
你确定它们没有因为被加载到你的应用程序中(即正在使用)而被锁定吗? - Richard
1个回答

6

不是File.Open锁定文件。

尝试使用:

using(var file = File.Open(file.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
   // process here
}

1
我不打开这些文件;我迭代文件夹中的文件,获取一些信息如名称、大小和版本。如果文件是.NET程序集,我使用一个方法来获取其版本号: private Version GetVersion(string fullpath) { if (File.Exists(fullpath)) { try { Assembly ass = Assembly.LoadFrom(fullpath); if (ass != null) { return ass.GetName().Version; } } catch (Exception) { //Not an assembly file return new Version(0, 0, 0, 0); } } return new Version(0, 0, 0, 0); }可能我找到了罪犯? - Ferdinando Santacroce
嗯... 汇编不是可处理的对象;File.Exists() 似乎也不是文件锁定器。 我很困惑:这个简单的工作正在变成一个大头疼! - Ferdinando Santacroce
1
@Ferdinando Santacroce 的锁定器是 Assembly.LoadFrom - Andrey
注释我的GetVersion()方法让事情运行起来了...是的,就是Assembly.LoadFrom! 以非锁定模式获取程序集版本,我该怎么做? 将文件复制到临时文件夹中并从这些临时文件中获取版本? 谢谢! Nando - Ferdinando Santacroce
@Ferdinando Santacroce 不要忘记接受答案 :) 是的,您可以通过首先将其读取为byte[]来避免锁定文件,如此处所述:https://dev59.com/83NA5IYBdhLWcg3wQ7e4 - Andrey
非常感谢 Andrey!:-) 再见,Nando - Ferdinando Santacroce

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