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

某些檔案砍不掉

尚未結案
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-09 16:36:01 IP:140.113.xxx.xxx 未訂閱
小弟我在網路上找到一份刪除檔案的片斷程式碼如下
int TForm1::DeleteFile(String fileName, bool allowUndo)
{
    SHFILEOPSTRUCT shop;
    ZeroMemory(&shop, sizeof(shop));
    shop.hwnd = Form1->Handle;
    shop.wFunc = FO_DELETE;             // Wanna delete file
    shop.pFrom = fileName.c_str();      // fileName that wanna be deleted
    shop.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION |  FOF_NO_CONNECTED_ELEMENTS;
    if(allowUndo)
        shop.fFlags |= FOF_ALLOWUNDO;   // Delete to Recycle Bin
    return(SHFileOperation(&shop));
}    void __fastcall TForm1::btnDeleteClick(TObject *Sender)
{
    ListView1->Items->BeginUpdate();
    while(ListView1->Selected)
    {
        if(DeleteFile(ListView1->Selected->Caption, cbxRecycle->Checked) == 0)
            ListView1->Selected->Delete();
        else
            break;
    }
    ListView1->Items->EndUpdate();
}
//ListView1 裡頭存放的是欲刪除檔案的完整路徑
可是現在有點問題就是, 大部分的檔案透過這個函式都可以砍掉,可是有些卻砍不掉, Windows會出現錯誤訊息
 
刪除檔案或資料夾發生錯誤
X 無法刪除 檔案:無法讀取來源檔案或磁碟
但是這些砍不掉的檔案,若是按下鍵盤的 Delete 鍵,卻又可以被砍掉. 也就是說,它們應該是沒有"正在使用中"的問題。 我知道這問題問得挺模糊的, 不過還是希望各位前輩幫我想想,有可能問題是出在哪裡呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :) 發表人 - chtai 於 2004/10/09 17:06:07
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-10 23:02:54 IP:210.244.xxx.xxx 未訂閱
引言: 小弟我在網路上找到一份刪除檔案的片斷程式碼如下
int TForm1::DeleteFile(String fileName, bool allowUndo)
{
    SHFILEOPSTRUCT shop;
    ZeroMemory(&shop, sizeof(shop));
    shop.hwnd = Form1->Handle;
    shop.wFunc = FO_DELETE;             // Wanna delete file
    shop.pFrom = fileName.c_str();      // fileName that wanna be deleted
    shop.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION |  FOF_NO_CONNECTED_ELEMENTS;
    if(allowUndo)
        shop.fFlags |= FOF_ALLOWUNDO;   // Delete to Recycle Bin
    return(SHFileOperation(&shop));
}    void __fastcall TForm1::btnDeleteClick(TObject *Sender)
{
    ListView1->Items->BeginUpdate();
    while(ListView1->Selected)
    {
        if(DeleteFile(ListView1->Selected->Caption, cbxRecycle->Checked) == 0)
            ListView1->Selected->Delete();
        else
            break;
    }
    ListView1->Items->EndUpdate();
}
//ListView1 裡頭存放的是欲刪除檔案的完整路徑
可是現在有點問題就是, 大部分的檔案透過這個函式都可以砍掉,可是有些卻砍不掉, Windows會出現錯誤訊息
 
刪除檔案或資料夾發生錯誤
X 無法刪除 檔案:無法讀取來源檔案或磁碟
但是這些砍不掉的檔案,若是按下鍵盤的 Delete 鍵,卻又可以被砍掉. 也就是說,它們應該是沒有"正在使用中"的問題。 我知道這問題問得挺模糊的, 不過還是希望各位前輩幫我想想,有可能問題是出在哪裡呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :) 發表人 - chtai 於 2004/10/09 17:06:07
chtai你好: 不小心運氣好,被我 >!因為你連 >! 我 class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { String name="C:\\test.txt"; name ='\0'; <---再加一個NULL terminated後才呼叫DeleteFile這function DeleteFile(name,true); } 結論是一定要double NULL terminated字串它才看的懂,所以都固定多加一個比較正確、保險!只是 另外chtai你砍檔一定要用這個function嗎?用一些BCB、C 的基本function不是簡單懂些嗎
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-11 02:35:05 IP:140.113.xxx.xxx 未訂閱
首先感謝m8815010大哥的解答,可是還是有幾點問題哩~ 1.我是在不固定情況下會出現那種錯誤訊息,不一定是直接接一個檔案。 2.什麼叫做 double NULL terminated的字串 呢? 3.因為查了查站上的文章,似乎只有這個函式可以把檔案丟到資源回收桶,不知是否還有別的方法可以實現丟到回收桶的嗎? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-11 09:39:51 IP:61.63.xxx.xxx 未訂閱
引言: 首先感謝m8815010大哥的解答,可是還是有幾點問題哩~ 1.我是在不固定情況下會出現那種錯誤訊息,不一定是直接接一個檔案。 2.什麼叫做 double NULL terminated的字串 呢? 3.因為查了查站上的文章,似乎只有這個函式可以把檔案丟到資源回收桶,不知是否還有別的方法可以實現丟到回收桶的嗎? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
chtai你好< >: 嗯,目前你這樣講,實在是無法猜測你的問題點< >!還有就是你的ListView那段,我沒去細查是否有問題! 希望你將有出現錯誤訊息的檔名,先獨立直接執行,不要經ListView內的取出動作等等等其它步驟,如我之前的測試:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String name="C:\\有問題的目錄\\有問題的檔案.txt";
 name ='\0';    <---再加一個NULL terminated後才呼叫DeleteFile這function
 DeleteFile(name,true);
}
這樣做主要有兩個目的: 1.將問題範圍先focus在deletefile這個function這裏,如果這樣單一處理一個檔就不行的話,就應該是這個function的問題了! 2.看看是不是可以找到固定會出錯的例子,比如說路徑過長啊,有長檔名的檔名啊,檔名內有非中文的字等等等… 總之就是先縮小問題範圍,可是找出固定的錯誤檔名最好!還有操作的環境或也有差,我的環境是 >!
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-11 16:53:52 IP:221.169.xxx.xxx 未訂閱
chtai:請參考
http://delphi.ktop.com.tw/topic.php?topic_id=22851
請問如何將檔案丟到資源回收筒(98,2000,nt)
答題得分者為:lcsboy
將lcsboy版大的Code直接Post:
記得: C的字串結尾是用'\0', 但是在用SHFileOperationh時
.pForm或.to的參數時, 要記得再補一個'\0'
(請參閱MSDN or SDK)
  char *From="C:\\readme.txt\0";
  SHFILEOPSTRUCT op;
  ZeroMemory(&op, sizeof(op));
  op.hwnd=this->Handle;
  op.wFunc=FO_DELETE;
  op.pFrom=From;
  op.fFlags=FOF_ALLOWUNDO;
  SHFileOperation(&op);
但我的BCB6,win-XP不加'\0'一樣成功?好奇怪!
請參考!
Andy Chang
------
Andy Chang
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-11 17:17:46 IP:140.113.xxx.xxx 未訂閱
引言:
chtai:請參考
http://delphi.ktop.com.tw/topic.php?topic_id=22851
請問如何將檔案丟到資源回收筒(98,2000,nt)
答題得分者為:lcsboy
將lcsboy版大的Code直接Post:
記得: C的字串結尾是用'\0', 但是在用SHFileOperationh時
.pForm或.to的參數時, 要記得再補一個'\0'
(請參閱MSDN or SDK)
  char *From="C:\\readme.txt\0";
  SHFILEOPSTRUCT op;
  ZeroMemory(&op, sizeof(op));
  op.hwnd=this->Handle;
  op.wFunc=FO_DELETE;
  op.pFrom=From;
  op.fFlags=FOF_ALLOWUNDO;
  SHFileOperation(&op);
但我的BCB6,win-XP不加'\0'一樣成功?好奇怪!
請參考!
Andy Chang
感謝兩位大哥的指教,問題似乎已經解決了, 只要再加上'\0'就可以了。 只可惜分數只能給一人,只好給先答的m8815010大哥啦 :) 說來奇怪,我用 WinXP 有的檔案可以,有的檔案不能砍掉。 Anyway,都加個'\0'就是了 :p 以下是小弟的拙作,拿出來獻醜,還望各位能批評指教 ^^ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57533 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
系統時間:2024-05-04 21:08:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!