精华内容
下载资源
问答
  • c# 删除程序占用的文件,清理删除文件,彻底删除文件,解除文件占用 文件打开时是,以共享模式打开 FileStream inputStream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); p....

    c# 删除程序占用的文件,清理删除文件,彻底删除文件,解除文件占用

    文件打开时,以共享读写模式打开

     FileStream inputStream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
     p.BackgroundImage = new Bitmap(inputStream);
     inputStream.Dispose();

    删除文件

    public void WipeFile(string filename, int timesToWrite)
            {
                try
                {
                    if (File.Exists(filename))
                    {
                        //设置文件的属性为正常,这是为了防止文件是只读
                        File.SetAttributes(filename, FileAttributes.Normal);
                        //计算扇区数目
                        double sectors = Math.Ceiling(new FileInfo(filename).Length / 512.0);
                        // 创建一个同样大小的虚拟缓存
                        byte[] dummyBuffer = new byte[512];
                        // 创建一个加密随机数目生成器
                        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
                        // 打开这个文件的FileStream
                        FileStream inputStream = new FileStream(filename, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
                        for (int currentPass = 0; currentPass < timesToWrite; currentPass++)
                        {
                            // 文件流位置
                            inputStream.Position = 0;
                            //循环所有的扇区
                            for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++)
                            {
                                //把垃圾数据填充到流中
                                rng.GetBytes(dummyBuffer);
                                // 写入文件流中
                                inputStream.Write(dummyBuffer, 0, dummyBuffer.Length);
                            }
                        }
                        // 清空文件
                        inputStream.SetLength(0);
                        // 关闭文件流
                        inputStream.Close();
                        // 清空原始日期需要
                        DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0);
                        File.SetCreationTime(filename, dt);
                        File.SetLastAccessTime(filename, dt);
                        File.SetLastWriteTime(filename, dt);
                        // 删除文件
                        File.Delete(filename);
                    }
                }
                catch (Exception)
                {
                }
            }


    展开全文
  • C#如何解除文件占用

    2013-12-12 09:31:12
    如题,需要切短某个文件与程序的关联,而不是删除文件或者杀掉进程
  • C#实现判断文件是否被占用与解除文件占用  收藏 北风其凉   发表于 8个月前 阅读 915 收藏 2 点赞 0 评论 0  https://my.oschina.net/Tsybius2014/blog/780750 ...
    C#实现判断文件是否被占用与解除文件占用
     
    • 发表于 8个月前 
    • 阅读 915 
    • 收藏 2 
    • 点赞 0 
    • 评论 0

      https://my.oschina.net/Tsybius2014/blog/780750

    最近遇到一个问题,我在实现一个C#客户端的附件上传功能时,只能上传未被其他进程占用的文件,因此每次上传文件前需要先判断被选中文件是否被占用。尤其是PDF文件,当以AdobeReaderXI打开时,文件会处于占用状态,此时若强行上传,会触发异常。

    我上网查了下使用C#判断文件是否被占用的方法。参考了这篇博客:

    http://www.cnblogs.com/MR520/archive/2012/03/20/2408782.html

    我实现了一个函数:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.IO;
    using System.Runtime.InteropServices; 
    
    namespace FileStatusTest
    {
        public class FileStatusHelper
        {
            [DllImport("kernel32.dll")]
            public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
    
            [DllImport("kernel32.dll")]
            public static extern bool CloseHandle(IntPtr hObject);
    
            public const int OF_READWRITE = 2;
            public const int OF_SHARE_DENY_NONE = 0x40;
            public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);  
    
            /// <summary>
            /// 查看文件是否被占用
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static bool IsFileOccupied(string filePath)
            {
                IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
                CloseHandle(vHandle);
                return vHandle == HFILE_ERROR ? true : false;
            }
        }
    }

    调用方法为:

    if (FileStatusHelper.IsFileOccupied(@"文件路径"))
    {
        MessageBox.Show("文件已被占用");
    }
    else
    {
        MessageBox.Show("文件未被占用");
    }

    测试结果如下:

    1、设有一PDF文件,打开前调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    2、使用AdobeReaderXI打开此PDF文件,调用函数FileStatusHelper.IsFileOccupied,显示【文件已被占用】

    3、关闭AdobeReaderXI后调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    在我遇到的场景中,实现对文件是否被占用进行判别就可以了,如文件已被占用,给出相应提示并让用户自己关闭占用文件的进程即可。

    不过,在好奇心的驱使下,我还是查了下如何使用C#语言解除其他进程对文件的占用。我用搜索引擎初步找了一下,发现要想仅使用C#做到这些还真不太容易。

    后来我参考了这个stackoverflow上的问题:

    http://stackoverflow.com/questions/242882/how-can-i-unlock-a-file-that-is-locked-by-a-process-in-net

    里面给出了一个建议,使用Unlocker软件的命令行参数实现对指定文件的解锁。

    我从百度上下载的Unlocker1.9.2,下载地址如下:

    http://dlsw.baidu.com/sw-search-sp/soft/c0/12918/Unlocker1.9.2.exe

    安装此程序后,使用下面的命令即可直接解锁指定文件:

    Unlocker.exe 要解锁的文件名 /s

    如果一定要使用C#解锁某一被占用的文件,可在Unlocker安装目录中将这四个文件提取出来:Unlocker.exe、UnlockerCOM.dll、UnlockerDriver5.sys、UnlockerHook.dll。将它们放到我们程序目录中,通过Process.Start方法调用Unlocker.exe,并附带上相关参数,就可以实现用C#代码解锁某一指定文件了。另有一点需要注意,运行Unlocker.exe时需要用到管理员权限。

    使用此方法测试结果如下:

    1、设有一PDF文件,打开前调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    2、使用AdobeReaderXI打开此PDF文件,调用函数FileStatusHelper.IsFileOccupied,显示【文件已被占用】

    3、使用Unlocker解锁后,调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    END

    展开全文
  • C#实现判断文件是否被占用与解除文件占用  收藏 北风其凉   发表于 8个月前 阅读 930 收藏 2 点赞 0 评论 0   最近遇到一个问题,我在实现一个C#客户端的附件...
    https://my.oschina.net/Tsybius2014/blog/780750
    C#实现判断文件是否被占用与解除文件占用
     
    • 发表于 8个月前 
    • 阅读 930 
    • 收藏 2 
    • 点赞 0 
    • 评论 0

      

    最近遇到一个问题,我在实现一个C#客户端的附件上传功能时,只能上传未被其他进程占用的文件,因此每次上传文件前需要先判断被选中文件是否被占用。尤其是PDF文件,当以AdobeReaderXI打开时,文件会处于占用状态,此时若强行上传,会触发异常。

    我上网查了下使用C#判断文件是否被占用的方法。参考了这篇博客:

    http://www.cnblogs.com/MR520/archive/2012/03/20/2408782.html

    我实现了一个函数:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.IO;
    using System.Runtime.InteropServices; 
    
    namespace FileStatusTest
    {
        public class FileStatusHelper
        {
            [DllImport("kernel32.dll")]
            public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
    
            [DllImport("kernel32.dll")]
            public static extern bool CloseHandle(IntPtr hObject);
    
            public const int OF_READWRITE = 2;
            public const int OF_SHARE_DENY_NONE = 0x40;
            public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);  
    
            /// <summary>
            /// 查看文件是否被占用
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static bool IsFileOccupied(string filePath)
            {
                IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
                CloseHandle(vHandle);
                return vHandle == HFILE_ERROR ? true : false;
            }
        }
    }

    调用方法为:

    if (FileStatusHelper.IsFileOccupied(@"文件路径"))
    {
        MessageBox.Show("文件已被占用");
    }
    else
    {
        MessageBox.Show("文件未被占用");
    }

    测试结果如下:

    1、设有一PDF文件,打开前调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    2、使用AdobeReaderXI打开此PDF文件,调用函数FileStatusHelper.IsFileOccupied,显示【文件已被占用】

    3、关闭AdobeReaderXI后调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    在我遇到的场景中,实现对文件是否被占用进行判别就可以了,如文件已被占用,给出相应提示并让用户自己关闭占用文件的进程即可。

    不过,在好奇心的驱使下,我还是查了下如何使用C#语言解除其他进程对文件的占用。我用搜索引擎初步找了一下,发现要想仅使用C#做到这些还真不太容易。

    后来我参考了这个stackoverflow上的问题:

    http://stackoverflow.com/questions/242882/how-can-i-unlock-a-file-that-is-locked-by-a-process-in-net

    里面给出了一个建议,使用Unlocker软件的命令行参数实现对指定文件的解锁。

    我从百度上下载的Unlocker1.9.2,下载地址如下:

    http://dlsw.baidu.com/sw-search-sp/soft/c0/12918/Unlocker1.9.2.exe

    安装此程序后,使用下面的命令即可直接解锁指定文件:

    Unlocker.exe 要解锁的文件名 /s

    如果一定要使用C#解锁某一被占用的文件,可在Unlocker安装目录中将这四个文件提取出来:Unlocker.exe、UnlockerCOM.dll、UnlockerDriver5.sys、UnlockerHook.dll。将它们放到我们程序目录中,通过Process.Start方法调用Unlocker.exe,并附带上相关参数,就可以实现用C#代码解锁某一指定文件了。另有一点需要注意,运行Unlocker.exe时需要用到管理员权限。

    使用此方法测试结果如下:

    1、设有一PDF文件,打开前调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    2、使用AdobeReaderXI打开此PDF文件,调用函数FileStatusHelper.IsFileOccupied,显示【文件已被占用】

    3、使用Unlocker解锁后,调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

    END

    展开全文
  • 【语言-c#文件占用如何解除

    千次阅读 2019-05-25 11:46:36
    C# 中使用Image.FromFile(string path)并使用System.IO.File.Delete(string path)后提示该文件正在被另一进程使用XXX的问题,是因为对应的文件在一直使用中 ,其生成的 Image 对象被 Disponse() 前都不会被解...

    1、加载文件后,删除文件时提示如下

    文件“..jpg”正由另一进程使用,因此该进程无法访问此文件。

    背景

    C# 中使用Image.FromFile(string path) 并使用 System.IO.File.Delete(string path) 后提示该文件正在被另一进程使用XXX的问题,是因为对应的文件在一直使用中 ,其生成的 Image 对象被 Disponse() 前都不会被解除锁定,这就造成了此问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等操作)。

    解决方案


    方法1:如果 Image 对象不需要保存在程序内存中,可以在进行删除、修改等操作之前将 Image 对象销毁
     

    System.Drawing.Image image = System.Drawing.Image.FromFile(filePath);
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(image);
    image.Dispose();

    方法2:如果 Image 对象需要保存在程序内存中,将从文件加载的 Image 绘制到程序内存中的 Image 上,然后将 从文件加载的 Image 对象销毁。

    System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
    System.Drawing.Image bmp = new System.Drawing.Bitmap(img.Width, img.Height, img.PixelFormat);
    
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
    g.DrawImage(img, 0, 0);
    g.Flush();
    g.Dispose();
    img.Dispose();


    方法3:以文件流的形式加载文件,加载完后关闭文件,然后将文件流转换成 Image 对象

    System.IO.FileStream fs = new System.IO.FileStream(filePath, FileMode.Open, FileAccess.Read);
    
    int byteLength = (int)fs.Length;
    byte[] fileBytes = new byte[byteLength];
    fs.Read(fileBytes, 0, byteLength);
    
    //文件流关閉,文件解除锁定
    fs.Close();
    
     MemoryStream mStream = new MemoryStream(fileBytes);
    Image image = Image.FromStream(mStream);


    因为 FromStream 方法参数应用的流必须一直保持打开,故而代码中有一个文件流是向MemeoryStream流的转换,从而可以关闭文件流,保持 MemoryStream 流的打开状态。在不用 mStream 时关闭。
    mStream.Close();

    2、文件被占用强制删除类

     public void WipeFile(string filename, int timesToWrite)
    {
        try
        {
            if (System.IO. File.Exists(filename))
            {
                //设置文件的属性为正常,这是为了防止文件是只读
                System.IO.File.SetAttributes(filename, System.IO.FileAttributes.Normal);
                //计算扇区数目
                double sectors = Math.Ceiling(new System.IO.FileInfo(filename).Length / 512.0);
                // 创建一个同样大小的虚拟缓存
                byte[] dummyBuffer = new byte[512];
                // 创建一个加密随机数目生成器
                System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
                // 打开这个文件的FileStream
                System.IO.FileStream inputStream = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);
                for (int currentPass = 0; currentPass < timesToWrite; currentPass++)
                {
                    // 文件流位置
                    inputStream.Position = 0;
                    //循环所有的扇区
                    for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++)
                    {
                        //把垃圾数据填充到流中
                        rng.GetBytes(dummyBuffer);
                        // 写入文件流中
                        inputStream.Write(dummyBuffer, 0, dummyBuffer.Length);
                    }
                }
                // 清空文件
                inputStream.SetLength(0);
                // 关闭文件流
                inputStream.Close();
                // 清空原始日期需要
                DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0);
                System.IO.File.SetCreationTime(filename, dt);
                System.IO.File.SetLastAccessTime(filename, dt);
                System.IO.File.SetLastWriteTime(filename, dt);
                // 删除文件
                System.IO.File.Delete(filename);
            }
        }
        catch (Exception)
        {
        }
    }

    3、文件被另一进程占用

    Download Download Handle (418 KB)

    string fileName = @"c:\aaa.doc";//要检查被那个进程占用的文件
    Process tool = new Process();
    tool.StartInfo.FileName = "handle.exe";//占用文件的进程
    tool.StartInfo.Arguments = fileName+" /accepteula";
    tool.StartInfo.UseShellExecute = false;
    tool.StartInfo.RedirectStandardOutput = true;
    tool.Start();          
    tool.WaitForExit();
    string outputTool = tool.StandardOutput.ReadToEnd();
    
    string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
    foreach(Match match in Regex.Matches(outputTool, matchPattern))
    {
        Process.GetProcessById(int.Parse(match.Value)).Kill();
    }

     

    展开全文
  • C# 如何解除文件占用,类似360中的功能。由于在程序中要对Access数据库进行压缩后备份,但是备份的时候该数据库被程序暂用,我试过在程序运行的时候用360解除一下占用,再压缩就不会报错,所以请教各位高人怎么用C#...
  • 主要介绍C#解决文件占用资源,比较实用,需要的朋友可以参考下。
  • 1、解除SQLite文件占用 关闭连接,并清理线程池 if(conn!=null) { conn.Close(); conn=null; } System.Data.SQLite.SQLiteConnection.ClearAllPools(); //清除连接池之后,数据库文件才能使用 2、SQLite备份...
  • 有一个古老的传说: 占用文件是可以被强制删除的。...如果是自己的程序对该文件文件流读写最好在完成或者异常的时候关闭流Close(),释放流Dispose(),后续才不会提示对此文件占用;如果不是自己的程序原...
  • c#+handle.exe实现升级程序在运行时自动解除文件占用的问题 http://www.zuowenjun.cn/post/2016/09/05/243.html https://docs.microsoft.com/zh-cn/sysinternals/downloads/handle ...
  • 文件取得byte数组,并且不占用 byte[] GetBytesFromFile(string spath) { FileStream file = new FileStream(spath, FileMode.Open, FileAccess.Read); byte[] bb = new byte[file.Length]; file.Read...
  • iobit unlocker 不同于其它解锁软件的部分在于它并非强制关闭那些占用文件的程序,而是以解除文件与程序关连性的方式来解锁,因此不会像其它解锁程序一样因为强制关闭程序而造成使用者可能的数据遗失。
  • //文件流关闭,文件解除锁定 fileStream.Close(); ImageList1.Images.Add(Image.FromStream(new MemoryStream(fileBytes))); 你的图片是不是用image.FromFile加到imagelist里的,如果是改成上述模式:从文件流中...
  • jy251 LS说KILL进程的朋友们···我说。。。你们真行!!!如果用户是administrator还行,如果不是怎么办?...C# code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
  • 共有俩种解决方式 使用using system.IO; 第一种: if (!File.Exists(path)) { File.Create(path).Close(); } 第二种: if (!File.Exists(path)) { using(File.Create(path)) { } }

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,759
精华内容 703
关键字:

c#解除文件占用

c# 订阅