delphi 判斷檔案是否在被使用中。

2022-03-01 07:58:00 字數 4809 閱讀 4683

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...