FileShare 매 거 진 사용 소결(파일 읽 기 및 쓰기 자물쇠)

개발 과정 에서 우 리 는 대량의 문서 와 상호작용 을 하고 문 서 를 읽 으 며 문 서 를 쓰 는 것 이 일상 이 되 었 다.현지 운영 이 완벽 하지만 생산 환경 에 오 르 면 손 쓸 수 없 는 의외 의 사고 나 개발 중의 고민 이 많이 발생 하기 때문에 저 는 일반적인 C\#문서 작업 에 대해 정 리 를 했 습 니 다.문 제 는 대부분이 다음 과 같 습 니 다.
1:어떤 파일 에 내용 을 기록 하고 다른 프로 세 스/스 레 드/후속 작업 에서 파일 내용 을 읽 을 때 이상 을 보고 합 니 다.알림 System.IO.IOException:파일"XXX"는 다른 프로 세 스에 서 사용 되 고 있 기 때문에 이 프로 세 스 는 이 파일 에 접근 할 수 없습니다.
2:한 파일 을 작업 한 후(읽 기/쓰기)추가 하려 면 System.IO.IOException:파일"XXX"를 다른 프로 세 스에 서 사용 하고 있 기 때문에 이 프로 세 스 는 이 파일 에 접근 할 수 없습니다.다음 문 제 는 1 과 비슷 하 다.
3:파일 을 삭제 하려 면 System.IO.IOException:파일"XXX"를 다른 프로 세 스에 서 사용 하고 있 기 때문에 이 프로 세 스 는 이 파일 에 접근 할 수 없습니다.
이런 것들 을 보면 경험 이 있 는 학생 들 은 자원 이 방출 되 지 않 았 다 고 말 할 수 있 지만 다음 과 같은 가능성 도 있다.우 리 는 파일 에 대한 작업 이 매우 빈번 하기 때문에 특정한 작업 클래스/구성 요 소 를 써 서 파일 간 의 작업 을 유지 하고 특정한 시간 을 알 아야 끝 납 니 다.흔히 볼 수 있 는 로 그 는 프로그램 이 시 작 될 때 까지 로 그 를 쓰기 시작 합 니 다.그러나 파일 을 조작 하기 위해 서 는 현재 로그 나 모든 로 그 를 볼 수 있 는 로그 뷰 어 를 제공 해 야 하 는 특수 한 작업(읽 기/쓰기/삭제)이 필요 합 니 다.이 럴 때 이상 의 문제 가 발생 하 는 것 을 피 할 수 없습니다

static void WriteFile(FileMode fileMode, FileAccess fileAccess, FileShare fileShare)
{
    Console.WriteLine("please input your content.");
    var content = Console.ReadLine();
    FileStream fs = new FileStream(FILEPATH, fileMode, fileAccess, fileShare);
    var buffer = Encoding.Default.GetBytes(content);
    fs.Write(buffer, 0, buffer.Length);
    fs.Flush();
}

首先,我声明了一个写文件方法,并调用它,它将我输入的内容写入指定的文件当中。

WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
Console.ReadKey();
 
그러나 파일 쓰기 작업 이 끝 난 후에 나 는 파일 흐름 의 자원 을 방출 하지 않 았 다.그래서 이 때 파일 에 자 물 쇠 를 만 들 수 있 습 니 다.나 는 windows 에서 그것 을 삭제 하려 고 시도 했다.
 
분명히 나 는 이 파일 을 삭제 할 수 없 었 다.그 다음 에 나 는 그것 을 읽 으 려 고 시도 했다

static void ReadFile(FileAccess fileAccess, FileShare fileShare)
{
    FileStream fs = new FileStream(FILEPATH, FileMode.Open, fileAccess, fileShare);
    var buffer = new byte[fs.Length];
    fs.Position = 0;
    fs.Read(buffer, 0, buffer.Length);
    Console.WriteLine(Encoding.Default.GetString(buffer));
}
나 는 파일 을 읽 는 방법 을 실 현 했 고 그것 을 호출 했다

WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);
모든 것 이 간단 합 니 다.방문 모드 는 읽 기 전용 입 니 다.그러면 위의 자물쇠 와 충돌 하지 않 을 것 입 니 다!

그러나 결 과 는 우리 가 예상 한 것 처럼 그렇게 되 지 않 았 다.왜 방문 할 수 없다 는 것 을 알 렸 을 까?돌 이 켜 보면 앞에서 나 는 windows 의 수첩 으로 이 파일 을 열 었 다.파일 이 잠 겨 있다 는 것 을 알 리 지 않 았 고 나 도 확실히 접근 할 수 있 었 다.그런데 왜 프로그램 에 도착 하면 접근 할 수 없 었 을 까?어쩌면 우 리 는 FileMode,FileAccess,FileShare 라 는 세 가지 매 거 진 에 중점 을 두 어야 할 지도 모른다.
FileMode
MSDN 의 설명 은 운영 체제 가 파일 을 여 는 방식 을 지정 하 는 것 입 니 다.이것 은 설명 이 필요 없 을 것 같 습 니 다.여러분 들 이 평소에 많이 사용 하 셨 을 것 같 습 니 다.MSDN 의 표 도 각 매 거 진 값 의 역할 을 잘 논술 하 였 으 니 나 는 설명 하지 않 겠 다.
FileAccess
파일 읽 기,쓰기,읽 기/쓰기 접근 권한 에 사용 할 상 수 를 정의 합 니 다.

이 매 거 진 것 도 많이 썼 고 묘사 도 통속 적 이 고 알 기 쉬 워 서 더 이상 설명 하기 가 곤란 합 니 다.^ ^!
FileShare
이 매 거 진 유형 은 모두 가 비교적 낯 설 것 이 라 고 믿 습 니 다.심지어 친구 들 도 보지 못 했 습 니 다.(부 끄 러 운 것 은 저도 그것 을 알 게 된 지 얼마 되 지 않 았 습 니 다)낯 설 고 낯 설 지만 그의 작용력 도 과소평가 할 수 없습니다.다만 Net 은 우 리 를 도와 그것 을 잘 포장 해서 우 리 는 그것 이 중요 한 역할 이 아니 라 고 생각 합 니 다.좋아,주제 에 들 어가 자!
다른 FileStream 대상 이 같은 파일 에 접근 할 수 있 는 형식 을 제어 하 는 상수 가 포함 되 어 있 습 니 다.이 말 이 무슨 뜻 이 죠?솔직히 말 해서,나 는 지금 한 마디 를 보 는 것 이 여전히 매우 복잡 하 다.많은 학우 들 이 보 는 것 도 안개 라 고 믿는다.괜찮아,우리 먼저 뛰 어 넘 자!

멤버 설명 을 보 니 FileAccess 와 비슷 하 다.잠시 베일 을 벗 겨 보 자!
FileShare.Read
말 그대로 파일 을 먼저 열 고(자원 이 방출 되 지 않 았 음)파일 을 읽 는 방식 으로 파일 에 접근 할 수 없 는 이상 을 던 지지 않 는 다 는 뜻 으로 이해 할 수 있 습 니 다.방금 실현 한 방법 을 이용 하여 쉽게 이 실험 을 완성 할 수 있다.
이것 은 무슨 일 입 니까?다 읽 은 것 으로 설정 되 어 있 지 않 습 니까?파일 을 읽 을 때 만 읽 기 공유 로 설정 할 수 있 습 니 다.다시 한 번 시도 해 보 겠 습 니 다.
이번 에는 처음으로 자원 을 방출 하지 않 았 을 때 다시 읽 을 수 있 습 니 다.공유 만 읽 고 파일 을 쓸 수 있 는 지 다시 한번 시도 해 보 겠 습 니 다

WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);
 
먼저 파일 의 내용 을 정확하게 읽 었 으 나,내 가 어떤 내용 을 쓰 려 고 시 도 했 을 때 또 잘못 보고 했다.그렇다면 이상 의 실험 에 따 르 면 이 읽 기 전용 공 유 는 파일 을 연속 으로 읽 어야 만 유효 하 다 는 것 을 알 수 있 습 니 다!
FileShare.Write
Read 의 경험 을 결합 하면 파일 을 쓸 때 공유 방식 을 Write 로 설정 해 야 파일 을 계속 쓸 수 있 고 그렇지 않 으 면 이상 을 던 질 수 있다 는 뜻 으로 이해 할 수 있 습 니 다.여기 가 재 미 있 을 때 Write 를 설정 하면 만능 Window 메모 장 도 파일 을 열 수 없습니다.
 
FileShare.ReadWrite
이상 의 경험 을 가지 고 말 그대로 이해 하면 이 ReadWrite 는 반드시 Read 와 Write 의 특성 을 결합 시 켰 다 고 볼 수 있 습 니 다.그럼 도대체 얘 가 무슨 소 용이 있 는 거 야?위 에서 우 리 는 파일 을 읽 을 때 Read 공 유 를 설정 하면 계속 읽 을 수 있 고 쓸 수 없 으 며,파일 을 쓸 때 Write 공 유 를 설정 하면 계속 쓸 수 있 고 읽 을 수 없다 는 것 을 알 고 있 습 니 다.그러나 우리 가 쓰기 공 유 를 설정 한 후에 파일 을 읽 으 려 고 할 때 어떻게 합 니까?자원 을 먼저 방출 하고 다시 불 러 올 수 밖 에 없 나 요?필요 없어,ReadWrite 는 이 때문에 태 어 난 거 야.

ReadFile(FileAccess.Read, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);

그러나 파일 을 쓸 때 공 유 를 Write 로 설정 하 는 것 은 허용 되 지 않 습 니 다.그렇지 않 으 면 파일 을 읽 을 때 ReadWrite 를 사용 하면 유효 하지 않 지만 모두 ReadWrite 로 설정 할 수 있 습 니 다.이것 은 반드시 많은 일상 개발 중의 번 뇌 를 해결 할 수 있 을 것 이다.
FileShare.None/FileShare.Delete
위의 경험 이 있 으 면 이 두 가 지 를 쉽게 이해 할 수 있 을 것 이 라 고 믿 습 니 다.None 는 후속 작업 을 허용 하지 않 고 Delete 는 나중에 삭제 작업 을 할 수 있 도록 합 니 다.
블랙박스 안의 내용
파일 작업 에 있어 서 우리 가 평소에 사용 하 는 것 은 다음 과 같은 몇 가지 일 수 있 습 니 다

ReadFile(FileAccess.Read, FileShare.Read);
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
실제로 그들 도 내부 에서 FileMode/FileAccess/FileShare 를 초기 화 했 습 니 다.예 를 들 어 File 의 정적 방법 은 마지막 에 하나 가 생 성 됩 니 다.
하나의 Stream 인 스 턴 스,그 중에서 개인 적 인 방법 을 호출 하 였 습 니 다.

막바지
이제 우 리 는 알 게 되 었 습 니 다.사실/FileShare 는 파일 흐름 을 제어 하 는'접근 권한'입 니 다.물론 이것 은 입문 파일 작업 일 뿐 입 니 다.스스로 필 기 를 했 고 여러분 에 게 도움 을 주 었 으 면 합 니 다!

좋은 웹페이지 즐겨찾기