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

執行程式時, tmp 檔出現正在被使用中

缺席
energybody
一般會員


發表:44
回覆:32
積分:15
註冊:2007-04-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-25 10:54:32 IP:211.21.xxx.xxx 訂閱
小弟在 trace delphi 程式時, 程式會開一些 c:\..\tmp.db 的檔案, 但是 trace 到一半後發現錯誤而要更改程式,這時的 c:\..\tmp.db 檔案是處於開啟的狀態, 於是用 program reset(CTRL-F2)來結束程式, 並修改程式後再執行, 卻出現 c:\..\tmp.db  檔案正在被使用中, ,小弟的程式中會先將 檔案 tmp.close 關閉, 但是在 tmp.createtable 時卻會出現此錯誤, 必需將  delphi 結束再重新執行 delphi, 請問有何 delphi 或 win32ap 可以在程式中將此檔案在程式中先真正的關閉, 而不會在 tmp.createtable 時出現錯誤..

tmpREV.close; <-----先 close
tmpREV.FieldDefs.Clear;
with tmpREV.FieldDefs do // Äæ¦ì»¡©ú ­n°O±o¸É
begin
add('Fn',ftString,10);
add('Hbl',ftstring,20);
.
.
end;
tmpREV.IndexDefs.Clear;
tmpREV.IndexDefs.Add('','Fn;Hbl',[ixprimary,ixunique]);
tmpREV.CreateTable; <--- 出現 正在使用中的錯誤

ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-25 17:24:30 IP:220.142.xxx.xxx 訂閱
建議你在程式的ONCLOSE也下一次
tmpREV.close;
或者
將連線關閉
------
======================
昏睡~
不昏睡~
不由昏睡~
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-25 18:03:41 IP:220.130.xxx.xxx 訂閱
program reset才不會管你程式怎麼寫,總之你用了就是強制關閉,你的程式碼根本就不會被執行,
windows的process有processtree,用Delphi IDE開起來的process如果process被關閉,那連帶其它的當然都會歸給IDE那個process
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
energybody
一般會員


發表:44
回覆:32
積分:15
註冊:2007-04-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-28 11:52:08 IP:211.21.xxx.xxx 訂閱
小弟還是不懂 coffee 先生的說明, 能不能再詳細的解釋一下.
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-28 12:07:10 IP:220.130.xxx.xxx 訂閱
你開一個新的project,在form show時showMessage兩次,
show第一次,就按Ctrl F2把程式關掉,
那第二次的showmessage還會出現嗎?不會吧?
那你又怎麼能寄望程式強制關閉時還替你收尾?
程式被強制中斷時,檔案鎖並不是直接還給Windows,而是遞移給開啟這個程式的執行緒,
那檔案鎖沒解開,你又開新的,新的嘗試讀取時當然就會失敗,
因為新的process跟舊的process是兩碼子事,
如果你非得要在Exception才作事,那就括一個try起來,在Exception時就先關掉file,
這樣你還可以正常的關閉程式。
如果程式的錯誤範圍這麼大,那你就去找unlocker吧..google就會有
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-05-28 12:14:15, 註解 改錯字XD‧
energybody
一般會員


發表:44
回覆:32
積分:15
註冊:2007-04-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-28 16:03:54 IP:211.21.xxx.xxx 訂閱
回 coffee 先生, 小弟有用 unlocker 來處理 可是 unlocker 卻說此 tmp 檔案未被 lock, 可是程式再執行時還是會出現此錯誤.
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-28 16:17:34 IP:220.130.xxx.xxx 訂閱
那可能就真的沒辦法了
因為我之前有遇到類似問題,Unlocker解開就能用,
並不清楚Delphi是不是有再作其它事情,
你看要不要考慮在自己的程式裡面去處理對tmp檔的開關,而不要使用Program Reset

或者是,既然是tmp檔,是否考慮在create之前先去嘗試delete,然後讓它自己create.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-05-28 16:23:56, 註解 無‧
nod32
初階會員


發表:3
回覆:29
積分:31
註冊:2007-05-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-29 10:50:58 IP:125.34.xxx.xxx 訂閱
在文件打开之后一定要使用try finally end;结构来做异常保护,这样可以保证在读写错误的时候可以执行到close指令。
比如(伪代码):
a.open
try
// 做你的工作
finally
a.close
end;

其次,你在程序开始的时候使用Close没有用的,因为你前一个出错的程序跟现在正在执行的程序不在一个进程空间里,就算你能得到之前文件的句柄,也不一定能够关闭的。因此不要在程序开始的时候进行Close操作,因为这个操作是无效的。
energybody
一般會員


發表:44
回覆:32
積分:15
註冊:2007-04-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-05 11:28:31 IP:61.62.xxx.xxx 訂閱
小弟有先用 delete, 但是還是被 BDE lock.
系統時間:2024-05-17 13:35:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!