procedure tform1.button1click(sender: tobject);
begin
if opendialog1.execute then
begin
if isfileinuse(opendialog1.filename) = true then
showmessage('檔案正在使用')
else
showmessage('檔案沒有使用');
end;
end;
function tform1.isfileinuse(fname : string) : boolean;
varhfileres : hfile;
begin
result := false; //返回值為假(即檔案不被使用)
if not fileexists(fname) then exit; //如果檔案不存在則退出
hfileres := createfile(pchar(fname), generic_read or generic_write,
0 , nil, open_existing, file_attribute_normal, 0);
result := (hfileres = invalid_handle_value); //如果createfile返回失敗 那麼result為真(即檔案正在被使用)
if not result then //如果createfile函式返回是成功
closehandle(hfileres); //那麼關閉控制代碼
end;
end.
首先,我們先來認識下createfile函式,它的原型如下
handle createfile(
lpctstrlpfilename, //指向檔名的指標
dworddwdesiredaccess, //訪問模式(寫/讀)
dworddwsharemode, //共享模式
lpsecurity_attributeslpsecurityattributes, //指向安全屬性的指標
dworddwcreationdisposition, //如何建立
dworddwflagsandattributes, //檔案屬性
handlehtemplatefile//用於複製檔案控制代碼
);下面是引數的說明
lpfilename
指向乙個空結尾字串。該引數指定了用於建立或開啟控制代碼的物件。
如果lpfilename的物件是乙個路徑,則有乙個最大字元數的限制。不能超過常量(max_path).這個限制指示了createfile函式如何解析路徑.
dwdesiredaccess
指定物件的訪問方式,程式可以獲得讀訪問權,寫訪問權,讀寫訪問權或者是詢問裝置("device query") 訪問權.
這個引數可以是下列值的任意組合
0指定詢問訪問權.程式可以在不直接訪問裝置的情況下查詢裝置的屬性.
generic_read
指定讀訪問權.可以從檔案中讀取資料,並且移動檔案指標.可以和generic_write組合成為"讀寫訪問權".
generic_write
指定寫訪問權.可以從檔案中寫入資料,並且移動檔案指標.可以和generic_read組合成為"讀寫訪問權".
dwsharemode
設定位標誌指明物件如何共享.如果引數是0, 物件不能夠共享. 後續的開啟物件的操作將會失敗,直到該物件的控制代碼關閉.
使用乙個或多個下列值的組合來共享乙個物件.
file_share_delete
windows nt:後續的僅僅請求刪除訪問權的開啟操作將會成功.
file_share_read
後續的僅僅請求讀訪問權的開啟操作將會成功.
file_share_write
後續的僅僅請求寫訪問權的開啟操作將會成功.
lpsecurityattributes
指向乙個 security_attributes 結構的指標用於確定如何在子程序中繼承這個控制代碼.如果這個引數是null,則該控制代碼不可繼承.
dwcreationdisposition
create_new
建立乙個新檔案. 如果該檔案已經存在函式則會失敗.
create_always
建立乙個新檔案.如果該檔案已經存在,函式將覆蓋已存在的檔案並清除已存在的檔案屬性
open_existing
開啟乙個檔案,如果檔案不存在函式將會失敗.
如查你使用createfile函式為裝置裝載控制台.請檢視批註中的"為什麼使用open_existing標誌"的部分.
open_always
如果檔案存在,開啟檔案. 如果檔案不存在,並且引數中有create_new標誌,則建立檔案.
truncate_existing
開啟乙個檔案,每次開啟,檔案將被截至0位元組.呼叫程序必須用generic_write訪問模式打
開檔案.如果檔案不存在則函式就會失敗.
dwflagsandatributes
為檔案指定屬性和標誌位
該引數可以接收下列屬性的任意組合.除非其它所有的檔案屬性忽略file_attribute_normal.
file_attribute_archive
檔案將被存檔,程式使用此屬性來標誌檔案去備份或移除
file_attribute_hidden
檔案被隱藏,它不會在一般資料夾列表中被裝載.
file_attribute_normal
檔案沒有被設定任何屬性.
file_attribute_offline
檔案的資料沒有被立即用到。指出正在離線使用該檔案。
file_attribute_readonly
這個檔案只可讀取.程式可以讀檔案,但不可以在上面寫入內容,也不可刪除.
file_attribute_system
檔案是系統的一部分,或是系統專用的.
dwflagandattributes可以接受下列標誌的任意組合。
file_flag_write_through
指示系統通過快速快取直接寫入磁碟.
file_flag_no_buffering
檔案的訪問開頭的位元組偏移量必須是扇區尺寸的整倍數.
檔案訪問的位元組數必須是扇區尺寸的整倍數.例如,如果扇區尺寸是512位元組程式就可以讀或者寫512,1024或者2048位元組,但不能夠是335,981或者7171位元組.
進行讀和寫操作的位址必須在扇區的對齊位置,在記憶體中對齊的位址是扇區尺寸的整倍數.
乙個將緩衝區與扇區尺寸對齊的途徑是使用virtualalloc函式. 它分配與作業系統記憶體頁大小的整倍數對齊的記憶體位址.因為記憶體頁尺寸和扇區尺寸--2都是它們的冪.
這塊內存在位址中同樣與扇區尺寸大小的整倍數對齊.
程式可以通過呼叫getdiskfreespace來確定扇區的尺寸.
file_flag_random_access
指定檔案是隨機訪問,這個標誌可以使系統優化檔案的緩衝.
file_flag_sequential_scan
指定檔案將從頭到尾連續地訪問.這個標誌可以提示系統優化檔案緩衝. 如果程式在隨機訪問檔案中移動檔案指標,優化可能不會發生;然而,正確的操作仍然可以得到保證
指定這個標誌可以提高程式以順序訪問模式讀取大檔案的效能, 效能的提高在許多程式讀取一些大的順序檔案時是異常明顯的.但是可能會有小範圍的位元組遺漏.
file_flag_delete_on_close
file_flag_backup_semantics
windows nt:指示系統為檔案的開啟或建立執行乙個備份或恢復操作. 系統保證呼叫程序忽略檔案的安全選項,倘若它必須有乙個特權.則相關的特權則是se_backup_name和se_restore_name.
你也可以使用這個標誌獲得乙個資料夾的控制代碼,乙個資料夾控制代碼能夠象乙個檔案控制代碼一樣傳給某些win32函式。
file_flag_posix_semantics
指明檔案符合posix標準.這是在ms-dos與16位windows下的標準.
file_flag_open_reparse_point
指定這個標誌制約ntfs分割槽指標.該標誌不能夠和creat_always一起使用.
file_flag_open_no_recall
指明需要檔案資料,但是將繼續從遠端儲存器中接收.它不會將資料存放在本地儲存器中.
這個標誌由遠端儲存系統或等級儲存管理器系統使用.
htemplatefile
為generic_read訪問的模式指定乙個控制代碼到模板檔案.模板檔案在檔案開始建立後提供檔案屬性和擴充套件屬性.
return values
返回值如果函式成功,返回乙個開啟的指定檔案的控制代碼.如果指定檔案在函式呼叫前已經存在並且dwcreation引數是create_always 或者open_always,呼叫getlasterror就會返回error_already_exists(表示函式成功). 如果函式檔案在呼叫前不存在則會返回0.
如果函式失敗,返會值會是invalid_handle_value. 更多的錯誤資訊可以呼叫getlasterror來獲得.
C 判斷檔案是否正在被使用
生成檔案的時候,如果該資料夾下的同名檔案被開啟 或者被使用 如果這時再生成乙個同名檔案,則會提示檔案正在被占用。解決方法有兩個,乙個是儲存的檔名改成該資料夾下不存在的 隨機數之類的xxoo都行,只要不存在就可以了 當然這裡指的是該同名檔案是被使用,如果該同名檔案不開啟,生成檔案的時候就直接將其覆蓋了...
判斷乙個檔案是否正在被使用
createfile函式的原型如下 handle createfile lpctstr lpfilename,指向檔名的指標 dword dwdesiredaccess,訪問模式 寫 讀 dword dwsharemode,共享模式 lpsecurity attributes lpsecuritya...
如何判斷乙個檔案是否正在被使用
這段時間在做檔案操作方面的工作.雖然看似簡單,實際卻很煩瑣,容易出現問題,加之測試也不是很方便.有時要向檔案寫入東西,在開啟檔案前不單要判斷檔案是否存在,還要判斷檔案是否被別人使用.如下 1using system 2using system.collections.generic 3using s...