파일 스트림이 Unix에서 공유 잠금을 사용하여 파일을 잠금
Unix에서 FileAccess.Read 권한만 있는 FileStream을 사용하여 파일을 연 다음, FileStream.Lock(Int64, Int64)을 호출하여 파일의 영역을 잠그면 작업이 성공합니다. 런타임에서 쓰기 잠금 대신 공유 또는 읽기 잠금으로 파일을 잠그기 때문에 성공합니다.
using (FileStream fs = File.OpenRead("testfile")) // Opening with FileAccess.Read only
{
fs.Lock((long) 3, (long) 1); // Attempting to lock a region of the read-only file
}
작업이 항상 성공한 Windows의 동작은 변경되지 않습니다.
이전 동작
Unix에서 읽기 권한만 있는 FileStream을 사용하여 파일을 연 다음, FileStream.Lock(Int64, Int64)을 호출하여 파일 영역을 잠그는 경우는 런타임에서 쓰기 잠금으로 파일을 잠그려고 했습니다. 그 결과 UnauthorizedAccessException 및 "경로에 대한 액세스가 거부되었습니다."라는 메시지가 표시됩니다.
새 동작
.NET 6부터 Unix에 대한 읽기 권한만 있는 FileStream을 사용하여 파일을 연 다음, FileStream.Lock(Int64, Int64)을 호출하여 파일 영역을 잠그면 런타임에서 읽기 잠금(공유 잠금이라고도 함)으로 파일을 잠급니다.
도입된 버전
.NET 6 RC 1
호환성이 손상되는 변경의 형식
이 변경은 이진 호환성에 영향을 줄 수 있습니다.
변경 이유
FileStream.Lock(Int64, Int64)은 사용자가 파일의 특정 영역을 잠글 수 있도록 하는 API입니다. 기본 잠금 방법을 선택할 수 있는 API가 없으므로 FileStream.Lock(Int64, Int64)은 파일 권한에 대한 적절한 잠금 방법을 올바르게 결정해야 합니다.
권장 작업
.NET 6 이전에는 파일을 잠그려면 다음 중 하나를 수행해야 했습니다.
- 코드가 Windows에서 실행 중이거나 FileStream이 FileAccess.Write 권한으로 열렸는지 확인합니다.
try catch
를 통해 FileStream.Lock(Int64, Int64) 호출을 래핑하여 UnauthorizedAccessException을 캡처합니다.
이러한 해결 방법 중 하나를 사용한 경우 이제 제거할 수 있습니다.
영향을 받는 API
.NET