如何判斷乙個檔案是否被關閉?

2021-06-07 04:31:23 字數 3117 閱讀 4622

做專案的時候遇到了下面這個問題:如何判斷乙個開啟的txt檔案是否被關閉?

在開啟乙個txt檔案的時候,notepad程式是自動通過檔案路徑的引數首先複製檔案,然後馬上就關閉了檔案通道,這個時候開啟的其實只是notepad程式而不是檔案本身。檔案本身的開啟與關閉是一瞬間的事情。也就是說notepad程式在讀取了檔案以後就馬上將檔案關閉了。(不知道這樣講對不對,還請大家指正。)

那麼我們判斷乙個txt檔案是否被關閉其實就是判斷這個notepad這個程序是否關閉。

最後找到了下面這個方法:

利用windows api判斷檔案共享鎖定狀態

鎖是作業系統為實現資料共享而提供的一種安全機制,它使得不同的應用程式,不同的計算機之間可以安全有效地共享和交換資料。要保證安全有效地操作共享資料,必須在相應的操作前判斷鎖的型別,然後才能確定資料是否可讀或可寫,從而為開發出健壯的程式提供切實依據。

同樣,在windows中,檔案可以共享模式開啟,它也涉及到鎖的操作問題。根據windows中檔案共享時加鎖範圍的大小,鎖可分為全域性鎖和區域性鎖;全域性鎖以鎖定檔案全部內容為特徵,而區域性鎖以鎖定檔案的區域性內容為特徵,且檔案的鎖定區域不可重複。根據windows中檔案共享時鎖的操作許可權分類,鎖可分為:讀鎖,寫鎖,讀寫鎖(可讀可寫,全域性鎖)。

利用上述檔案中鎖的區域不可重複的特性,我們可嘗試給指定檔案加一全域性鎖。若加鎖成功,說明指定檔案未被其它程序鎖定;否則,說明有其它程序鎖定了該檔案。這裡,我們利用兩個windows api檔案操作函式:openfile和createfile來實現鎖定狀態的判斷。

具體對createfile的第三個引數的共享模式認識還不是很深刻。。。回頭再好好看看windows核心程式設計。。。

接著上幾天的那個問題。

以前都是用winexec或者是system函式建立的子程序,這次用createprocess來獲得它的控制代碼。

createprocess函式。這個函式有10個引數。汗~~~~。其實我們主要用到的就是第乙個引數,第二個引數,還有最後乙個引數。

bool winapi createprocess(

__inout_opt lptstr lpcommandline,

__in_opt lpsecurity_attributes lpprocessattributes,

__in_opt lpsecurity_attributes lpthreadattributes,

__in bool binherithandles,

__in dword dwcreationflags,

__in_opt lpvoid lpenvironment,

__in_opt lpctstr lpcurrentdirectory,

__in lpstartupinfo lpstartupinfo,

__out lpprocess_information lpprocessinformation

);

第乙個引數是要開啟的應用程式的路徑,第二個引數是命令列引數。最後乙個引數是用來返回新建立的程序的控制代碼。

自己仔細看了一下《windows核心程式設計》這本書。但是不怎麼看的懂。。。因為畢竟10個引數要全部看懂的話就比較困難的。

handle opennewfile(lpstr newfilepath)

;security_attributes saprocess, sathread;

process_information piprocess;

saprocess.nlength = sizeof(saprocess);

saprocess.lpsecuritydescriptor = null;

saprocess.binherithandle = true;

sathread.nlength = sizeof(sathread);

sathread.lpsecuritydescriptor = null;

sathread.binherithandle = false;

char command[100];

strcpy(command, "notepad.exe ");

strcat(command, newfilepath);

bool fret =createprocessa("c:\\windows\\system32\\notepad.exe",

command, null, null, false, null, null, null, &si, &piprocess);

if(fret == true)

return(piprocess.hprocess);

return 0;

}

這段**的前面初始化部分是copy《windows核心程式設計》的。引數lpstr newfilepath 是檔案的路徑名稱。

然後這個函式返回乙個新建立的程序的控制代碼

hres = opennewfile(newfilepath);// 獲得建立新程序開啟notepad檔案的控制代碼

waitforsingleobject(hres, infinite);

下面是waitforsingleobject這個函式原型:

dword winapi waitforsingleobject(

__in handle hhandle,

__in dword dwmilliseconds

);這個函式很簡單,第乙個引數就是控制代碼,第二個引數是等待多少時間(以毫秒計算)。這樣就達到了阻塞的效果。

如果是infnite,就是等到程序終止的時候才進行下面的**,否則就一直阻塞等待。

這樣一來問題就很好的解決了。

如果是直接用notepad開啟某個檔案,怎麼知道它關閉了呢?其實思路應該還是跟上面的一樣,就是首先獲得這個程序的控制代碼,判斷這個控制代碼是否存在,如果不存在,那麼應該就是結束了。

接下來再來解決上篇部落格裡寫的那個問題。我首先用notepad檔案開啟乙個.txt檔案。然後再用createfile開啟這個檔案,並且設定第三個引數為0,就是設定共享模式為不共享,這個時候使用createfile能開啟檔案並且獲得乙個控制代碼,這就說明這個時候notepad程式已經關閉了.txt檔案。

不知道自己講的對不對,有什麼錯誤還懇請大家指正。

如何判斷乙個檔案是否為PE檔案

pe檔案,portable executable file format簡稱。那麼如何判斷乙個檔案是否為pe格式的檔案?1 首先檢驗檔案頭部第乙個字的值是否等於 image dos signature,是則 dos mz header 有效。2 一旦證明檔案的 dos header 有效後,就可用e...

如何判斷乙個檔案是否正在被使用

這段時間在做檔案操作方面的工作.雖然看似簡單,實際卻很煩瑣,容易出現問題,加之測試也不是很方便.有時要向檔案寫入東西,在開啟檔案前不單要判斷檔案是否存在,還要判斷檔案是否被別人使用.如下 1using system 2using system.collections.generic 3using s...

判斷乙個表單是否被修改過

判斷乙個表單是否被修改過,在不少地方需要用到。例如,使用者開啟乙個訂單編輯頁,過一會後,他要關閉頁面,如果使用者有修改,那最好能提示下他 請問您確定要離開本頁嗎?確認離開當前頁面嗎?n未儲存的資料將會丟失!n請按 確定 以繼續,或者按 取消 回到當前頁。如果使用者沒有修改,則不用提醒。qwrap裡提...