2009-08-16 23 views
1

我已經用.NET編寫了一個程序,它通過源目標和目標目錄及其子目錄的所有文件遞歸,比較lastwritetime並根據比較結果將文件複製到/從目的地目錄中刪除。.NET中的某些File.IO對象(如DirectoryInfo)在程序終止後仍保留可移動設備引用

例如,目標目錄是可移動驅動器(usb)上的目錄,即使在程序關閉後,我也無法從我的電腦中刪除USB驅動器。沒有其他程序有USB打開(例如資源管理器),程序不再出現在任務列表中。

該項目工程通過獲取的DirectoryInfo每個目錄和使用

DirectoryInfo dir = new DirectoryInfo(path); 

我用的GetFiles來獲取所有文件的子目錄:

var files =dir.GetFiles(); 

然後一個foreach通過所有文件循環來檢查過濾掉一些文件(手動完成,因爲我想要使用RegEx的多個模式)。

基於正則表達式過濾器未排除的文件被添加到SortedList,一個用於源目錄,另一個用於目標目錄。

這是比較函數使用的。它創建的源列表,並使用使用模式的目的地列表中的枚舉之一:

using (var srcEnum = _srcFileInfos.GetEnumerator()) 
{ 
    using (var dstEnum = _dstFileInfos.GetEnumerator()) 
    { 
     ... // compare code 
    } 
} 

最後,文件副本或使用

File.Copy 
File.Delete 

刪除的有我俯瞰而言什麼的內存管理,即使在關閉程序後,仍會保留對USB驅動器的引用?

回答

0

您可能已關閉該程序,但請檢查以確保該進程已真正終止。使用任務管理器查找過程,然後關閉它,然後檢查任務管理器以確保它確實消失。

+0

關閉程序後,進程不在進程列表中。 – rekna 2009-08-16 22:15:16

+0

好。我們不再需要考慮一種可能性! – 2009-08-16 22:19:26

+0

這可能是因爲我從USB啓動程序...當我從光盤啓動程序時,它似乎沒有鎖定USB驅動器。我還沒有100%確定。 – rekna 2009-08-19 21:36:33

0

您可以使用免費的Unlocker實用程序來枚舉文件對象上存在的鎖。或者,您可以使用Sysinternals' HANDLE.EXE列出所有正在運行的進程的所有句柄。

+0

當運行句柄時,沒有對usb驅動器的引用的進程(使用分配的驅動器號檢查) – rekna 2009-08-16 22:16:07

+0

解鎖器說什麼? – 2009-08-17 03:49:44

+0

Unlocker根本不反應......它只是不明白什麼阻止了USB驅動器被彈出。 Vista應該告訴我是什麼導致了鎖,而不是僅僅告訴我'某些東西'使用我的USB驅動器 – rekna 2009-08-17 09:41:39

0

我非常確定,從usb啓動程序,導致了usb設備的鎖定,儘管我不明白爲什麼。自從我開始運行本地驅動器的程序後,我再也沒有遇到任何鎖。也許是因爲它的調試版本?不知道。

相關問題