2013-04-19 3 views
3

디렉토리에 파일을 생성 한 후 해당 파일을 만든 프로그램이 실행중인 동안에는 디렉토리가 잠 깁니다. 자물쇠를 풀 수있는 방법이 있습니까? 나중에 디렉토리 쌍의 이름을 바꿔야하고 "경로에 대한 액세스"... "거부 됨"을 말하는 IOException이 표시됩니다.프로그램이 실행 중일 때 파일 생성 후 디렉토리 잠김

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 
} 

using 문의 asures을.

희망이 내가 당신이 using 문 사용하는 것이 좋습니다

+1

와우 굉장한, 나는 그것을 몰랐다! – theknut

4

FileStream을 종료 해 보셨습니까? 예 :

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

예외가 발생할 경우 파일 열기/만들기를'using'으로 감싸는 것이 좋습니다. 이 한 줄에는 중요하지 않지만 예외를 throw 할 수있는 Create()와 Close() 사이에 다른 코드가있는 경우에는 필요합니다. –

+0

@ 매튜 왓슨 합의. 아르투로의 해결책이 적절합니다. –

2

하는 데 도움이 :

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

을하지만 당신은 using 문에 개체 이니셜 라이저를 사용하여 알고 있어야합니다

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(); 
} 

Position 설정자가 예외를 throw하면 Dispose()이 임시 변수로 호출되지 않습니다.

+0

여기서는 그렇지 않습니다. 'File.Open (path)'와'File.Create (path)'는 생성자가 아니기 때문에 객체 초기화로 표현할 수 없습니다. 정적 메소드입니다. 두 번째 using 문에서 구문이 컴파일되지 않습니다. –

+0

@ArturoMartinez : 예, 시나리오를 재생산하기위한 객체 생성자가 있어야합니다. 나는 그것을 고정시켰다 (FileStream은 File.Open()의 insted). –