另一程序正在使用此文件,进程无法访问
项目中的程序需要自动更新
大概思路
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();
}
}
}
希望能帮助到遇见类似问题的同学