另一程序正在使用此文件,进程无法访问

项目中的程序需要自动更新

大概思路

1、通过主程序(判断是否需要更新)打开更新程序

2、通过更新程序关闭主程序

3、通过更新程序下载压缩包

4、解压(新的主程序)

5、打开主程序

在第五步的时候本机测试没问题,发布到另一台机子之后总是报错

另一程序正在使用此文件,进程无法访问....

经过一番排查发现问题出在解压时没有释放文件资源(不知道描述是否准确,另外为什么本机测试不报错!)

原解压代码如下:

public static void UnZip(string fileToUpZip, string zipedFolder, string password)
{
if (!File.Exists(fileToUpZip))
{
return;
}

if (!Directory.Exists(zipedFolder))
{
Directory.CreateDirectory(zipedFolder);
}

ZipInputStream s = null;
ZipEntry theEntry = null;

string fileName;
FileStream streamWriter = null;
try
{
s = new ZipInputStream(File.OpenRead(fileToUpZip));
s.Password = password;
while ((theEntry = s.GetNextEntry()) != null)
{
if (theEntry.Name != String.Empty)
{
fileName = Path.Combine(zipedFolder, theEntry.Name);
//判断文件路径是否是文件夹
if (fileName.EndsWith("/") || fileName.EndsWith("//"))
{
Directory.CreateDirectory(fileName);
continue;
}

streamWriter = File.Create(fileName);
int size = 2048;
var data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
finally
{
if (streamWriter != null)
{
streamWriter.Close();
streamWriter = null;
}
if (theEntry != null)
{
theEntry = null;
}
if (s != null)
{
s.Close();
s = null;
}
GC.Collect();
GC.Collect(1);
}
}

修改后代码如下:

public static void UnZip(string fileToUpZip, string zipedFolder, string password)
{
if (!File.Exists(fileToUpZip))
{
return;
}

if (!Directory.Exists(zipedFolder))
{
Directory.CreateDirectory(zipedFolder);
}

using (ZipInputStream zis = new ZipInputStream(File.Open(fileToUpZip, FileMode.Open)))
{
zis.Password = password;
ZipEntry ze = zis.GetNextEntry();
while (ze != null)
{
string fileName = Path.Combine(zipedFolder, ze.Name);
//文件夹
if (fileName.EndsWith("/") || fileName.EndsWith("//"))
{
if (!Directory.Exists(fileName))
{
Directory.CreateDirectory(fileName);
}
}
//文件
else
{
using (FileStream fs = File.Create(fileName))
{
int size = 2048;
var data = new byte[2048];
while (true)
{
size = zis.Read(data, 0, data.Length);
if (size > 0)
{
fs.Write(data, 0, size);
}
else
{
break;
}
}
}
}
ze = zis.GetNextEntry();
}
}
}

希望能帮助到遇见类似问题的同学

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。