全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1170
推到 Plurk!
推到 Facebook!

一个奇怪的错误,帮忙

尚未結案
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-04 15:45:03 IP:218.104.xxx.xxx 未訂閱
begin DeleteFile(ADstFile); RenameFile(ATmpFile, ADstFile); 《----有时成功,有时失败 end; 资源管理器打开并浏览到ADstFile的目录时,有时成功,有时失败 当关闭资源管理器后,运行总能成功 是不是ADstFile删除后资源管理器还没有来得及更新,导致的? 各位有遇到过这个现象吗?怎么解决?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-04 16:23:58 IP:210.65.xxx.xxx 未訂閱
Hi:    建議你修改一下程式碼如下,如此比較好判定 Rename 失敗原因
procedure TForm1.Button1Click(Sender: TObject);
var
    OldName,NewName: WideString;
begin
    NewName := 'D:\Book1.xls';
    OldName := 'D:\Book2.xls';
    IF FileExists(OldName) THEN
        BEGIN
            IF FileExists(NewName) THEN
                BEGIN
                    IF NOT DeleteFile(NewName) THEN
                        BEGIN
                            ShowMessage('目的檔已存在,且無法刪除!!');
                            Exit;
                        END;
                END;
            IF ReNameFile(OldName,NewName) THEN
              ShowMessage('更名成功')
            ELSE
              ShowMessage('更名失敗')
        END
    ELSE
        ShowMessage(OldName   ' 檔案不存在!!');
end;
原則上,我認為應該與資源管理器(檔案總管?)無關,Rename 失敗原因不外乎 1.Source File 使用中 2.無 Source File 3.Target File 已存在 4.... 你再試試 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-04 18:31:06 IP:211.20.xxx.xxx 未訂閱
// 如果保證刪檔一定會成功 可如下加個延遲時間
begin
  DeleteFile(ADstFile);
  Sleep(200);//建議加個延遲
  RenameFile(ATmpFile, ADstFile);   《----有时成功,有时失败
end;
 
  當然最好如Fishman 大的建議增加一些可能的錯誤判斷比較好喔!!!
發表人 - chance36 於 2004/02/04 18:34:08
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-05 08:30:42 IP:218.104.xxx.xxx 未訂閱
谢谢两位: 经检测,每次执行DeleteFile(ADstFile);均成功, 资源管理器没有浏览到ADstFile目录时,RenameFile也都成功, 但资源管理器浏览到ADstFile所在的目录时,执行RenameFile时有失败, ========= 加上Sleep(200);后好多了。 怎样才能彻底解决问题?
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-05 11:27:04 IP:218.104.xxx.xxx 未訂閱
刚才试了一下: begin if not DeleteFile(ADstFile) then Exit; if FileExists(ADstFile) then ShowMessage('文件不是被成功删除了吗?'); end; ADstFile 为一个33M大小的文件,然后打开资源管理其并浏览到ADstFile目录下 运行App,可以发现确实存在文件被成功删除后, FileExists仍然返回True的现象。
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-05 12:44:40 IP:210.65.xxx.xxx 未訂閱
Hi:    那你試試以下寫法
begin
    if not DeleteFile(ADstFile) then Exit;
    While FileExists(ADstFile) then
        Sleep(200);
    RenameFile(ATmpFile, ADstFile);
end;
-------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-05 12:49:10 IP:210.65.xxx.xxx 未訂閱
Hi:    Sorry,筆誤,完整寫法如下
procedure TForm1.Button7Click(Sender: TObject);
var
    OldName,NewName: WideString;
begin
    NewName := 'D:\bb.exe';
    OldName := 'D:\aa.exe';
    IF FileExists(OldName) THEN
        BEGIN
            IF FileExists(NewName) THEN
                BEGIN
                    IF NOT DeleteFile(NewName) THEN
                        BEGIN
                            ShowMessage('目的檔已存在,且無法刪除!!');
                            Exit;
                        END
                    ELSE
                        BEGIN
                            While FileExists(NewName) DO
                                Sleep(200);
                        END;
                END;
            IF ReNameFile(OldName,NewName) THEN
              ShowMessage('更名成功')
            ELSE
              ShowMessage('更名失敗')
        END
    ELSE
        ShowMessage(OldName   ' 檔案不存在!!');
end;
-------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-06 08:16:52 IP:218.104.xxx.xxx 未訂閱
仍然不行啊: 我使用while(FileExists(FDstFile) do begin ShowMessage('文件成功删除,但仍然被检测到'); Sleep(100); end; 有无一个procedure,直到文件彻底删除成功后才返回?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-06 08:29:32 IP:210.65.xxx.xxx 未訂閱
Hi:    lovelypp ,
while(FileExists(FDstFile) do
    begin
        Sleep(100);
    end;
主要功能即在於檢測是否存在 FDstFile,因先前已下過 DeleteFile(FDstFile) 且執行成功,迴圈只是在檢測系統是否已徹底刪除文件,以繼續執行 ReName 動作 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-06 12:27:28 IP:218.104.xxx.xxx 未訂閱
问题已解决,使用 ShFileOperate即可,删除文件后资源管理器也立即得到更新
系統時間:2024-07-05 23:41:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!