C#判斷文件是否正在被使用


生成文件的時候,如果該文件夾下的同名文件被打開(或者被使用),如果這時再生成一個同名文件,則會提示文件正在被占用。

解決方法有兩個,一個是保存的文件名改成該文件夾下不存在的(隨機數之類的XXOO都行,只要不存在就可以了),當然這里指的是該同名文件是被使用,如果該同名文件不打開,生成文件的時候就直接將其覆蓋了;

另一個是判斷當前文件的狀態,如果當前文件被操作了,則該干嘛干嘛,如果沒有被操作,那就生成了。

從網上找了好多資料,今天記錄下,以免將來用到,直接上代碼,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;
using System.Web.Mvc;

namespace HotelInventory.Web.Models.Repository
{
    public static class FileControlRepository1
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr _lopen(string lpPathName, int iReadWrite);//調用windowsdll
 
        [DllImport("kernel32.dll")]
        public static extern bool CloseHandle(IntPtr hObject);//調用windowsdll
        public const int OF_READWRITE = 2;//這些參數是不可少的,當然也可以不聲明,直接將值賦值給對應的函數,這里只是生明變量將其存起來而已
        public const int OF_SHARE_DENY_NONE = 0x40;//這些參數是不可少的,當然也可以不聲明,直接將值賦值給對應的函數,這里只是生明變量將其存起來而已
        public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);

        public static int IsFileOpen(string path)
        {
            string vFileName = path;
            if (!File.Exists(vFileName))
            {                
                return 0;//文件不存在
            }
            IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);//windows Api上面有定義擴展方法
       if (vHandle == HFILE_ERROR) 
       {         
         return 2;//文件被占用
       }
       CloseHandle(vHandle);//windows Api上面有定義擴展方法
       return 1;//文件存在且沒被占用
     }
  }
}

以上代碼直接調用就可以了,path是完整的文件路徑,命名空間也不要忘了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM