做專案的時候遇到了下面這個問題:如何判斷乙個開啟的txt檔案是否被關閉?
在開啟乙個txt檔案的時候,notepad程式是自動通過檔案路徑的引數首先複製檔案,然後馬上就關閉了檔案通道,這個時候開啟的其實只是notepad程式而不是檔案本身。檔案本身的開啟與關閉是一瞬間的事情。也就是說notepad程式在讀取了檔案以後就馬上將檔案關閉了。(不知道這樣講對不對,還請大家指正。)
那麼我們判斷乙個txt檔案是否被關閉其實就是判斷這個notepad這個程序是否關閉。
最後找到了下面這個方法:
利用windows api判斷檔案共享鎖定狀態
鎖是作業系統為實現資料共享而提供的一種安全機制,它使得不同的應用程式,不同的計算機之間可以安全有效地共享和交換資料。要保證安全有效地操作共享資料,必須在相應的操作前判斷鎖的型別,然後才能確定資料是否可讀或可寫,從而為開發出健壯的程式提供切實依據。具體對createfile的第三個引數的共享模式認識還不是很深刻。。。回頭再好好看看windows核心程式設計。。。同樣,在windows中,檔案可以共享模式開啟,它也涉及到鎖的操作問題。根據windows中檔案共享時加鎖範圍的大小,鎖可分為全域性鎖和區域性鎖;全域性鎖以鎖定檔案全部內容為特徵,而區域性鎖以鎖定檔案的區域性內容為特徵,且檔案的鎖定區域不可重複。根據windows中檔案共享時鎖的操作許可權分類,鎖可分為:讀鎖,寫鎖,讀寫鎖(可讀可寫,全域性鎖)。
利用上述檔案中鎖的區域不可重複的特性,我們可嘗試給指定檔案加一全域性鎖。若加鎖成功,說明指定檔案未被其它程序鎖定;否則,說明有其它程序鎖定了該檔案。這裡,我們利用兩個windows api檔案操作函式:openfile和createfile來實現鎖定狀態的判斷。
接著上幾天的那個問題。
以前都是用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裡提...