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

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

大概思路

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();
}
}
}

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

时间: 2024-11-06 21:28:35

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

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

重启iis,提示"另一个程序正在使用此文件,进程无法访问".一开始就怀疑是80端口被占用,修改iis的端口为其它端口,重启iis, 果然成功. 在命令行,netstat -nabo,查看80端口,发现是被apache占用. 修改apache的80端口为81. 修改下面文件中的listener 80为listener 81,然后重启apache或是重启电脑. Apache\Apache\conf\httpd.conf

启动IIS 网站出现错误 另一个程序正在使用此文件,进程无法访问

可能你安装了Apache; IIS启动失败,手工启动它,提示:"另一个程序正在使用此文件,进程无法访问!" 怀疑80端口被其他程序占用,改为8080后正常. 在DOS下输入: netstat -ano 查看80端口信息中的PID号,然后打开任务管理器查看对应PID的程序名称. 打开任务管理器,点击"查看"/选择列,勾选"PID(进程标识符)",然后单击"进程"标签,找到80端口对应的pid,就可以看到是那个程序占用的了.启动I

iis提示“另一个程序正在使用此文件,进程无法访问。(异常来自HRESULT:0x80070020)

看看IIS的网站,惊人的发现default web site是停止状态.印象中没有停止它啊.右键->管理网站->启动.点击启动后居然弹出:"另一个程序正在使用此文件,进程无法访问.(异常来自HRESULT:0x80070020)"也就是我的default web site 无法启动. 上次一顿搜索,欣喜的发现好文章一篇(http://www.cnblogs.com/rickie/articles/49016.html),描述的情况和我的情况基本一样,参考下, 运行 cmd

IIS 另一个程序正在使用此文件,进程无法访问。(异常来自HRESULT:0x80070020)

netstat -obna 另一个程序正在使用此文件,进程无法访问.(异常来自HRESULT:0x80070020) .用上面的命令,找到 80,443 端口 或者你对应的站点端口. 确认是那个端口被占用后,关闭该程序!启动IIS web站点

App_global.asax.pdb: 另一个程序正在使用此文件,进程无法访问。

页面修改后,浏览报错,信息如下. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0042: 创建调试信息文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\257988b7\a87cd954\App_global.asax.PDB”时发生错误 --“c:\Windows\Microsoft.NET\Fra

kafka启动报错:另一个程序正在使用此文件,进程无法访问。

在Windows上启动kafka_2.12-1.1.0报以下错误:[2018-05-08 10:24:51,777] ERROR Failed to clean up log for __consumer_offsets-17 in dir D:\JavaSoft\kafka_2.12-1.1.0\JavaSoftkafka_2.12-1.1.0log due to IOException (kafka.server.LogDirFailureChannel)java.nio.file.File

Windows安装python包出现PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问的问题解决方案

在python中安装sqlalchemy时,总是提示(当安装依赖有vs的python包时,可能会出现以下错误:) PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问.: 'C:\\Users\\T470P\\AppData\\Local\\Temp\\pip-build-cqvhyle9\\sqlalchemy' 因为windowns下的终端显示用的还是gbk编码,所以还得修改pip的源代码 打开c:\program files\python36

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示“文件正在由另一进程使用,因此该进程无法访问此文件”. 这是文件的并发写入问题,就需要用到线程同步.而微软也给进程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Threadin

【转】“正由另一进程使用,因此该进程无法访问该文件”的问题&解决方法

正在写一个手指画图的程序C# + WPF其中有一部分是加载外部某PNG文件,放入BitmapImage,再作为Image的Source显示在Canvas上画了几笔之后,再存回这个PNG文件================问题=================BitmapImage这个对象没有Dispose方法,始终无法释放,因此在之后FileStream试图写这个文件时出现"正由另一进程使用,因此该进程无法访问该文件"的问题BitmapImage bitmap = new Bitmap