2016-08-19 33 views
1

SO上有幾個線程描述瞭如何使用Sysinternals進程監視器等工具來檢查哪個應用程序創建了一個文件。是這樣的可能編程從.net?如何以編程方式確定哪個進程在.net中創建了一個文件?

背景:我的程序有使用它的自動化接口來遠程控制一個專有的第三方應用程序,而我從該應用程序所需要的功能之一具有這樣它會在%TEMP%一堆臨時文件被稱爲tmpXXXX.tmp錯誤(與.net的Path.GetTempFileName()相同)但不刪除它們。這會導致C驅動器隨着時間的推移而變滿,最終導致應用程序失敗。我已經向製造商提交了一個bug,但我們暫時需要一個臨時解決方法,所以我想將FileSystemWatcher放在%TEMP%的手錶tmp*.tmp上,收集這些文件,並且在完成對第三方應用程序的操作後,刪除他們。但是這是有風險的,因爲另一個應用程序也可能將具有相同文件名模式的文件寫入%TEMP%,所以我只想刪除那些由NastyBuggyThirdPartyApplication.exe創建的文件。

這無論如何可能嗎?

+0

我知道你怎麼知道哪個文件打開了 - 但是如果它現在關閉了...... – BugFinder

+0

可能存在的問題:如果您可以在自定義用戶帳戶下運行該程序,那麼您可以簡單地檢查文件的所有者。 – HugoRune

+0

文件中沒有內容包含您正在尋找的信息。您在創建文件時必須「待在那裏」並監控相關應用程序,否則您必須採取欺騙手段,例如上述用戶帳戶。 –

回答

0

這種事情是可能的,但也許有點棘手。

  1. 要知道是誰創建了文件,請查看擁有它的用戶。因此,您可能需要創建特定用戶,並且該應用程序將在該特定用戶下運行。爲了做到這一點,你需要創建一個小型應用程序,通過冒充另一個用戶來啓動你的馬車應用程序,所以在應用程序內完成的任何事情都將在這個用戶之下,因此創建文件...

  2. 我不' t知道如何監視並在創建文件時觸發,但沒有任何東西可以阻止您設置每5分鐘或10分鐘醒來的計時器,然後檢查目錄中的任何文件是否由應用程序用戶擁有並關閉,因此它會刪除它。

  3. 也許如果他們對這個錯誤修復做出反應很快,那麼您將不需要很長時間的應用程序。所以另一種解決方案,如果可能的話可能只是改變Temp文件夾到另一個驅動器,它有很多的空間...

+0

我目前正在進行選項3,因爲在這個系統上創建另一個用戶並不那麼簡單。這是一個控制一堆測量設備的系統,需要非常特殊的配置。用戶和組由域處理,我不想冒任何風險。但是,我看到只有這個特殊應用程序使用的文件背後的模式,因爲這些文件是以其專有格式存在的。所以我只是檢查文件是否包含特定位置的特定事物,以便能夠確定要刪除哪些文件。 – rabejens

0

一種解決方案是您使用FileWatcher自動刪除所有的文件,但刪除您之前應檢查該文件當前是否未被其他進程鎖定或使用,例如Sysinternal Suite有一個名爲handle.exe的工具可以執行此操作。在命令行中使用它:

handle.exe -a

您可以從C#程序調用這個(有可能是雖然一些性能問題)

所以,你會做的是當一個文件創建您驗證它是否正在使用或鎖定(例如,您可以使用Is there a way to check if a file is in use?中提供的代碼),然後將其刪除。

大多數情況下,當應用程序使用臨時文件時,它會鎖定它以防止您擔心的事情,以便從其他進程中刪除文件。

據我所知,沒有確定的方法來確定哪個進程創建了一個特定的文件。

相關問題