2013-04-19 4 views
3

После того, как я создал файл в каталоге, каталог заблокирован, пока работает моя программа, которая создала файл. Есть ли способ освободить замок? Мне нужно переименовать каталог пару строк позже, и я всегда получаю сообщение IOException «Доступ к пути» ... «denied».Справочник заблокирован после создания файла во время работы программы

Directory.CreateDirectory(dstPath); 
File.Copy(srcPath + "\\File1.txt", dstPath + "\\File1.txt"); // no lock yet 
File.Create(dstPath + "\\" + "File2.txt"); // causes lock 

ответ

8

File.Create(string path) Создает файл и оставляет поток открытым.

вам нужно сделать следующее:

Directory.CreateDirectory(dstPath); 
File.Copy(srcPath + "\\File1.txt", dstPath + "\\File1.txt"); 
using (var stream = File.Create(dstPath + "\\" + "File2.txt")) 
{ 
    //you can write to the file here 
} 

В заявлении, используя asures вы, что поток будет закрыт, а замок на файл будет выпущен.

Надеется, что это помогает

+1

Ничего себе, я этого не знал! – theknut

4

Вы пытались закрыть свой FileStream? например

var fs = File.Create(dstPath + "\\" + "File2.txt"); // causes lock 
fs.Close(); 
+5

Обратите внимание, что рекомендуется использовать файл open/create в 'using', в случае исключений. Не важно для этого однострочного слоя, но если между Create() и Close(), которые могут генерировать исключения, существует другой код, это необходимо. –

+0

@MatthewWatson Согласен. Решение Артуро подходит. –

2

я предлагаю вам использовать using заявление:

using (var stream = File.Create(path)) 
{ 
    //.... 
} 

но вы также должны знать, используя инициализаторы объектов при помощи операторов:

using (var stream = new FileStream(path) {Position = position}) 
{ 
    //.... 
} 

в этом случае он будет составлен в:

var tmp = new FileStream(path); 
tmp.Position = position; 
var stream = tmp; 

try 
{ } 
finally 
{ 
    if (stream != null) 
     ((IDisposable)stream).Dispose(); 
} 

и если исключение setter throw Position, Dispose() не будет вызываться для временной переменной.

+0

Это не тот случай; 'File.Open (path)' и 'File.Create (path)' не могут быть выражены инициализацией объекта, потому что они не являются конструкторами, они являются статическими методами. Синтаксис во втором операторе using даже не компилируется. –

+0

@ArturoMartinez: Да, должен быть конструктор объекта для воспроизведения такого сценария. Я исправил его (FileStream insted из File.Open()). –