2010-08-26 2 views
3

Представьте приложение winform, которое копирует обновленные сборки из исходной папки A в папку назначения B. Я использую простые методы DirectoryInfo.GetFiles для заполнения списка, сравнивая версию сборки в папке A и B; если некоторые сборки новее, я начинаю мой метод обновления. В этом методе, перед копированием, я стараюсь, если все файл в папке B не используется:Файлы блокировки 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! 
    } 
} 

Ну, из-за предыдущий код UpdateListView, которые используют FileInfo, чтобы получить информацию, чтобы показать, все мои файлы результатов в использовать!

Файлы блокировки FileInfo! Это возможно?

Может кто-нибудь предложить способ обойти эту проблему?

Спасибо, Nando

+1

Вы уверены, что они не заблокированы должен быть загружен в приложение (т.е. используется)? – Richard

ответ

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.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 поймать (Exception) \t \t \t \t { \t \t \t \t \t // Не файл сборки \t \t \t \t \t Ретур n новая версия (0, 0, 0, 0); \t \t \t \t} \t \t \t} \t \t \t возвращение новой версии (0, 0, 0, 0); \t \t} Возможно, я нашел виновного? –

+0

Mmm ... Сборка не является одноразовым объектом; File.Exists(), похоже, тоже не является файловым шлюзом. Я в замешательстве: эта простая работа становится большой головной болью! –

+0

@ Ferdinando Santacroce locker is 'Assembly.LoadFrom' – Andrey

Смежные вопросы