線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2516
推到 Plurk!
推到 Facebook!

請問如何知道檔案正被開啟?

尚未結案
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-06 15:17:36 IP:61.66.xxx.xxx 未訂閱
如標題,謝謝.
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-06 17:12:54 IP:210.61.xxx.xxx 未訂閱
try
  openfile....
except
  on EFOpenError do
  ......
end;
發表人 - pedro 於 2003/11/06 17:14:04
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-06 20:02:44 IP:61.66.xxx.xxx 未訂閱
我把我的用途說明一下,我有一個數值會寫在INI檔裡面,那個數值會一直更動累計,這個檔案可能同時會有好幾個程式會用到,所以我必須去檢查這個檔案是否正被使用,如果沒有,我才將值取出運算後在存入.
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-07 01:11:18 IP:61.31.xxx.xxx 未訂閱
Hi shihchin您好: 可以在INI裡多設一個識別值, 當有人使用使設為1, 計算完回填時再設為0, 所以需使用此INI時就可直接讀此值來作判斷 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-07 08:48:08 IP:210.61.xxx.xxx 未訂閱
那若那個ini已被create 第二個程式去create時 便會raise exception 用
try 
  fini:=TIniFile.Create(...)
  dosomething
except 
  排除錯誤
end
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-07 10:24:33 IP:61.66.xxx.xxx 未訂閱
可是這樣不是也會有同時使用的問題嗎?    
引言: Hi shihchin您好: 可以在INI裡多設一個識別值, 當有人使用使設為1, 計算完回填時再設為0, 所以需使用此INI時就可直接讀此值來作判斷 我不是高手, 高手是正在銀幕前微笑的人. < face="Verdana, Arial, Helvetica">
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-07 10:57:58 IP:147.8.xxx.xxx 未訂閱
open and hold an exclusive lock on the file... e.g. fh := FileOpen('xxx.ini',fmShareExclusive); Then use API to access the ini, WritePrivateProfileString, GetPrivateProfile, etc.
ghyghost
一般會員


發表:3
回覆:8
積分:2
註冊:2003-03-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-07 16:36:59 IP:218.27.xxx.xxx 未訂閱
function IsFileInUse(FileName: TFileName): Boolean; var HFileRes: HFILE; begin Result := False; if not FileExists(FileName) then Exit; HFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_value); if not Result then CloseHandle(HFileRes); end; procedure TForm1.Button1Click(Sender: TObject); var InUse: Boolean; begin // ... repeat InUse := IsFileInUse('C:\xx.txt'); Application.ProcessMessages; Sleep(300); // 休息一下 until Not InUse; // ... end;
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-07 18:10:47 IP:218.160.xxx.xxx 未訂閱
引言: 可是這樣不是也會有同時使用的問題嗎?
引言: Hi shihchin您好: 可以在INI裡多設一個識別值, 當有人使用使設為1, 計算完回填時再設為0, 所以需使用此INI時就可直接讀此值來作判斷 我不是高手, 高手是正在銀幕前微笑的人. < face="Verdana, Arial, Helvetica">
舉個例子:

var IniF : TIniFIle;
begin
   INIF := TINIFile.Create(ExtractFilePath(Application.ExeName)   'MyIni.INI');
   if IniF.ReadInteger('個人設定','執行中', 0) = 1 then 被開啟
      exit
   else begin  未被開啟
      IniF.WriteInteger('個人設定','執行中', 1);
     ...開始自己的計算, 計算完後再回寫...
   end;
   INIF.Free;
end;
一開始就先判斷並回寫, 這時間非常短 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-08 12:00:33 IP:203.222.xxx.xxx 未訂閱
引言: 我把我的用途說明一下,我有一個數值會寫在INI檔裡面,那個數值會一直更動累計,這個檔案可能同時會有好幾個程式會用到,所以我必須去檢查這個檔案是否正被使用,如果沒有,我才將值取出運算後在存入.
很不好的方法, 有隱性的 Bug 存在於時間性因數上
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-11-08 12:11:24 IP:61.221.xxx.xxx 未訂閱
1 自己寫個封裝外殼 不怕別人開 2 使用系統的特性加密 例如這個簡單的方式 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38032 3 利用壓縮工具 加上密碼也行 4 寫iso也行 5 md5判斷 也行 不過 你是要不讓別人用 還是要自己知道有改過 至於我是想開不開不是很重要
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-11-13 14:19:11 IP:61.66.xxx.xxx 未訂閱
是否有其他的方法可以避免這個問題?    
引言:
引言: 我把我的用途說明一下,我有一個數值會寫在INI檔裡面,那個數值會一直更動累計,這個檔案可能同時會有好幾個程式會用到,所以我必須去檢查這個檔案是否正被使用,如果沒有,我才將值取出運算後在存入.
很不好的方法, 有隱性的 Bug 存在於時間性因數上
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-11-13 14:59:01 IP:147.8.xxx.xxx 未訂閱
引言: 是否有其他的方法可以避免這個問題?
Open and lock the file exclusively and do not use TIniFile.
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-11-20 09:41:12 IP:218.32.xxx.xxx 未訂閱
HANDLE hFile;
HANDLE hAppend;
DWORD  dwBytesRead, dwBytesWritten, dwPos;
char   buff[4096];     do 
{ 
    if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) 
    { 
        dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END); 
        LockFile(hAppend, dwPos, 0, dwBytesRead, 0); 
        WriteFile(hAppend, buff, dwBytesRead, 
            &dwBytesWritten, NULL); 
        UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0); 
    } 
} while (dwBytesRead == 4096); 
 
// Close both files.
 
CloseHandle(hFile); 
CloseHandle(hAppend);
 
數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D [url="http://anpino.begin.8d8d.com"]Programmers Guide[/url] 發表人 - anpino 於 2003/11/20 09:42:55 發表人 - anpino 於 2003/11/20 09:45:44
系統時間:2024-05-10 8:34:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!