2011-03-24 59 views
1

當窗口中的任何程序或其他進程使用它時,是否有任何方法來刪除文件? 我搜索並找到了這2種方法:如何刪除Windows使用的文件?

1-在註冊表中使用RunOnce項; 我不會使用這個,因爲我不想等待Windows重啓或其他任何東西......寧願按時完成它!

2使用本頁聲明的方式:http://www.delphipages.com/forum/showthread.php?t=201190 這裏的問題是它在NT窗口下有用,我需要一種方法適用於所有Windowses!

謝謝。

+3

您的選項2等待重新啓動。你真的想支持98/ME嗎?打開文件時,您無法刪除文件。如果你打開一個文件,然後其他人在你完成之前將其刪除,你會感到失望。 – 2011-03-24 21:45:28

+1

當前正在使用**時,您可能想要刪除哪個文件**?不能等到重新啓動? – 2011-03-24 22:57:00

+1

注意:MoveFileEx(... MOVEFILE_DELAY_UNTIL_REBOOT)方法將只在用戶具有管理權限時才起作用,否則如果將返回ACCESS_DENIED – 2011-03-24 23:31:35

回答

4

這裏的問題是它在NT窗口下有用,我需要一種方法適用於所有Windowses!

所有現代桌面視窗(XP,Vista,7)也是NT。你真的需要和NT < 4或Win98一起工作嗎?甚至贏得CE /手機/電話?可能不會。

如果你需要立即刪除一個打開的文件,你可以做的唯一的事情就是使用調試器特權附加到每個進程,看看它是否有文件上的任何句柄打開,如果是的話關閉它們。您可以使用例如Process Explorer手動執行此操作。許多應用程序不會對他們的文件關閉做出反應;當他們試圖用死衚衕做某事時,希望他們排除異樣。

不幸的是,在Windows中沒有任何選擇可以將存在Unix文件的文件附加到一個文件句柄,而無需存儲在光盤上的文件名下。

+0

好吧..這會導致你附加的應用程序有很多問題,我不認爲這是正確的事情。 – 2011-03-24 22:09:27

+1

確實很少。對於處理泄漏的應用程序(包括Explorer!)或殺死惡意軟件可能很有用,但它不是日常工具。 – bobince 2011-03-24 22:10:58

+0

我完全同意你的看法。 – 2011-03-24 22:14:29

1

嘗試MoveFileEx與MOVEFILE_DELAY_UNTIL_REBOOT標誌。將推遲移動或刪除操作,直到重新啓動。

編輯: 如果您不想重新啓動,唯一的選擇是關閉這些句柄。 ProcessExplorer這樣做,並始終工作,我沒有看到任何進程崩潰。有關枚舉句柄的詳細信息,請參閱 http://www.codeguru.com/forum/archive/index.php/t-176997.html。但保持薄荷,你應該枚舉系統中的所有進程,並在Vista +上表現出不同的行爲(需要提升)

+0

-1:他說他不能等到Windows重啓。 – 2011-03-24 21:49:28

+0

但是這很有幫助,因爲他想要的東西不能真正做到。 – 2011-03-25 02:12:23

+0

請看這裏:http://stackoverflow.com/questions/14530252/how-can-i-copy-replace-a-dll – 2013-01-26 16:22:18

1

你不能在有人使用它時刪除文件。無論你多努力,Windows都不會讓你失望。它可以處理一些文件,但通常它不起作用。 當沒有人使用該文件時,您可以嘗試的是推遲刪除。你可以:

1 - 使用RunOnce,但你不想這樣做。
2 - 等待一個循環,嘗試刪除該文件。僞代碼:

DeleteFile 
Check if you was able to delete or if file still exists. 
if you are able to delete, then exit loop. 

這是你可以做的最好的,我能記住的。

+0

爲什麼人們給-1沒有任何解釋?我想知道我的答案有什麼問題。 – 2011-03-24 21:55:52

+0

爲什麼+1?有了這個循環,你可以等到重新啓動。 OP需要的是行動,而不是天真的循環。所以這不是他能做的最好的事情。所以我投票以上解決方案 – 2011-03-24 22:41:48

+2

它不是一個天真的循環。他可以添加一個timout功能,所以他不會永久卡在循環中。不久或稍後,該文件打開的應用程序將關閉該文件,循環將能夠刪除該文件。另外,關閉其他應用程序處理並不是一個好主意。 – 2011-03-24 22:47:04

-1

您的文件很可能被鎖定,因爲某些進程的句柄對他們開放。這是刪除或移動文件時Access denied結果最常見的原因。

一個非常鈍的方法是關閉該句柄。

然後Handles tool from SysInternals(你可以下載源代碼)可以爲你做到這一點:我已經成功地使用它。

注1:您需要管理權限才能使用它。

注2:關閉來自另一個進程的句柄被認爲非常粗魯,並且可能會使該進程不穩定。

+0

我認爲OP已經有這麼多的建立,你只是重新說明這個問題。什麼是解決方案? – 2013-01-26 16:24:29

+0

解決方案是強制關閉這些文件的句柄。 – 2013-01-26 18:47:21

+0

使用第三方應用程序?問題是關於編寫代碼來做到這一點,而不是手動執行。當然,你需要關閉手柄,這是常識部分。無論如何,我只是想解釋爲什麼我認爲你被低估了。 – 2013-01-26 19:02:52