天天看點

C# winform中判斷檔案是否處于打開狀态

最近做一個課題,要求winform用戶端能儲存接收到的實驗資料到檔案(如.txt檔案),并能打開儲存好了的實驗資料文檔,當資料檔案已經被打開,要提示檔案已被打開,也就是如何判斷檔案是否處于打開狀态,然後給出相應提示。通過查找資料發現C#本身是很難判斷一個檔案是否被打開的,相關資料給出需用到windowsAPI來實作,這種方法按理說是可以的,但也許是我沒有完全領會到相關函數的意義和傳回值,緻使不能判斷檔案已經被打開,相關的程式和問題給出如下:

public class FileStaues
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr _lopen(string lpPathName, int iReadWrite);//IntPtr相當于long類型

        [DllImport("kernel32.dll")]
        private static extern bool CloseHandle(IntPtr hObject);

        private const int OF_WRITE = 2;

        private const int OF_SHARE_DENY_NONE = 0x40;

        private static readonly IntPtr HFILE_ERROR = new IntPtr(964);

        public static int FileIsOpen(string fileFullName)
        {
            if (!File.Exists(fileFullName))
            {//不存在檔案
                return -1;
            }
            //handle的值始終不是-1,這樣就無法傳回1,也就不能判定檔案已經打開,就是這個地方有問題
            IntPtr handle = _lopen(fileFullName, OF_WRITE | OF_SHARE_DENY_NONE);

            if (handle == HFILE_ERROR)
            {//檔案已經打開
                return 1;
            }

            CloseHandle(handle);

            return 0;
        }
    }
           

相關的調用:

private int SaveOpenResult;

SaveOpenResult = FileStaues.FileIsOpen(ReceiveFileName);
if (SaveOpenResult == 0)
     System.Diagnostics.Process.Start(ReceiveFileName);
else if (SaveOpenResult == -1)
     throw new Exception("檔案不存在...");
else if(SaveOpenResult == -1)
     throw new Exception("檔案已打開...");  //當按了“打開”按鈕後出現.txt儲存檔案,但當在次按了“打開”按鈕後還是會出現.txt儲存檔案,不提示已經被打開
           

希望有人能指出這種方法的錯誤之處,謝謝了!!!

為了能提示儲存檔案已經被打開,需尋找另外的方法。。。

通過查找C#打開檔案的相關資料,C#打開檔案可使用

      System.Diagnostics.Process.Start(檔案路徑\檔案名);

語句來打開,這是使用程序來打開檔案,相當于打開一個檔案就是開了一個程序,那麼能否通過判斷相關的程序是否退出來判定檔案是否處于打開狀态呢?經過試驗,是可以的,程式如下:

<span style="font-family: Arial, Helvetica, sans-serif;">System.Diagnostics.Process OpenSaveFileProc;//指定程序</span><pre name="code" class="csharp">private void OpenSaveButton01_Click(object sender, EventArgs e)//打開儲存檔案
        {
            try
            {
                if (!File.Exists(檔案路徑\檔案名))
                    throw new Exception("檔案不存在...");
                if (OpenSaveFileProc == null || OpenSaveFileProc.HasExited == true)
                    OpenSaveFileProc = System.Diagnostics.Process.Start(檔案路徑\檔案名);
                else throw new Exception("檔案已打開...");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message, "出錯提示");
            }
        }
           

結果如圖:

C# winform中判斷檔案是否處于打開狀态

第一次按了“打開”按鈕,打開檔案

C# winform中判斷檔案是否處于打開狀态

再次按了“打開”按鈕後,判斷RCF.txt檔案已經被打開,并給出出錯提示,而不會再次出現RCF.txt檔案框。

個人原創,轉載請注明出處!!!