某些檔案砍不掉 |
尚未結案
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
小弟我在網路上找到一份刪除檔案的片斷程式碼如下
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 發送簡訊給我 |
引言: 小弟我在網路上找到一份刪除檔案的片斷程式碼如下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不是簡單懂些嗎?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
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
首先感謝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 發送簡訊給我 |
引言: 首先感謝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 發送簡訊給我 |
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 發送簡訊給我 |
引言:感謝兩位大哥的指教,問題似乎已經解決了, 只要再加上'\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 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)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
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |