2010-08-26 102 views
3

想象一個winform應用程序,它將更新後的程序集從源文件夾A複製到目標文件夾B. 我使用簡單的DirectoryInfo.GetFiles方法填充列表視圖,比較文件夾A和B中的程序集版本;如果某些程序集較新,我開始更新方法。 在這種方法中,在複製之前,我嘗試,如果B中文件夾中的所有文件都沒有使用:因爲以前UpdateListView代碼,使用的FileInfo獲得的信息顯示,我的所有文件會導致FileInfo鎖定文件!

var B = new DirectoryInfo("myBfolder"); 
foreach (var file in aFolder.GetFiles()) 
{ 
    try 
    { 
     //File not in use 
     File.Open(file.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (Exception ex) 
    { 
     //File in use! 
    } 
} 

好,使用!

FileInfo鎖定文件!這可能嗎?

有人可以提出一種方法來繞過這個問題嗎?

謝謝 南多

+1

你確定他們不會因被加載到你的應用程序鎖定(即在使用)? – Richard 2010-08-26 15:08:14

回答

4

不,這是File.Open誰鎖定文件。

試圖把它變成使用:

using(var file = File.Open(file.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    // process here 
} 
+0

我不打開這些文件中的任何一個;我迭代文件夾中的文件,獲得一些信息,如名稱,大小和版本。 我用一個方法來獲得的版本,如果文件是一個.NET程序集: \t \t私人版本GetVersion(字符串FULLPATH) \t \t { \t \t \t如果(File.Exists(FULLPATH)) \t \t \t { \t \t \t \t嘗試 \t \t \t \t { \t \t \t \t \t Assembly ass = Assembly.LoadFrom(fullpath); \t \t \t \t \t如果(個屁!= NULL) \t \t \t \t \t { \t \t \t \t \t \t回ass.GetName()。版; \t \t \t \t \t} \t \t \t \t} \t \t \t \t趕上(例外) \t \t \t \t { \t \t \t \t \t //未部件文件 \t \t \t \t \t retur新版本(0,0,0,0); \t \t \t \t} \t \t \t} \t \t \t返回新版本(0,0,0,0); \t \t} 大概我找到了罪犯? – 2010-08-26 14:53:55

+0

嗯... 裝配不是一次性物品; File.Exists()似乎也不是一個文件更衣室。 我很困惑:這個簡單的工作正變得非常頭疼! – 2010-08-26 15:00:14

+0

@Ferdinando Santacroce更衣室是'Assembly.LoadFrom' – Andrey 2010-08-26 15:19:27