asp.net 파일 읽 기와 쓰기 동작 설명(읽 기와 쓰기 자물쇠)

문 제 는 대부분 다음 과 같다.
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();

image image
그러나 파일 쓰기 작업 이 끝 난 후에 나 는 파일 흐름 의 자원 을 방출 하지 않 았 다.그래서 이 때 파일 에 자 물 쇠 를 만 들 수 있 습 니 다.나 는 windows 에서 그것 을 삭제 하려 고 시도 했다.
image
분명히 나 는 이 파일 을 삭제 할 수 없 었 다.그 다음 에 나 는 그것 을 읽 으 려 고 시도 했다.
 
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);
모든 것 이 간단 합 니 다.방문 모드 는 읽 기 전용 입 니 다.그러면 위의 자물쇠 와 충돌 하지 않 을 것 입 니 다!
image
그러나 결 과 는 우리 가 예상 한 것 처럼 그렇게 되 지 않 았 다.왜 방문 할 수 없다 는 것 을 알 렸 을 까?돌 이 켜 보면 앞에서 나 는 windows 의 수첩 으로 이 파일 을 열 었 다.파일 이 잠 겨 있다 는 것 을 알 리 지 않 았 고 나 도 확실히 접근 할 수 있 었 다.그런데 왜 프로그램 에 도착 하면 접근 할 수 없 었 을 까?어쩌면 우 리 는 FileMode,FileAccess,FileShare 이라는 세 가지 매 거 진 에 중점 을 두 어야 할 지도 모른다.FileMode MSDN 의 설명 은 운영 체제 가 파일 을 여 는 방식 을 지정 하 는 것 입 니 다.이것 은 설명 할 필요 가 없 을 것 같 습 니 다.여러분 들 이 평소에 많이 사용 하 시 는 것 같 습 니 다.MSDN 의 표 도 각 매 거 진 값 의 역할 을 잘 논술 하 였 으 니 나 는 설명 하지 않 겠 다.FileAccess 는 파일 읽 기,쓰기,읽 기/쓰기 접근 권한 에 사용 할 상수 입 니 다.
image
이 매 거 진 것 도 많이 썼 고 묘사 도 통속 적 이 고 알 기 쉬 워 서 더 이상 설명 하기 가 곤란 합 니 다.^ ^!FileShare 는 이 매 거 진 유형 이 모두 가 낯 설 고 심지어 친구 들 도 보지 못 할 것 이 라 고 믿 습 니 다.(부 끄 러 운 것 은 저도 그것 을 알 게 된 지 얼마 되 지 않 았 습 니 다)낯 설 고 낯 설 지만 그의 작용력 도 과소평가 할 수 없습니다.다만 Net 은 우 리 를 도와 그것 을 잘 포장 해서 우 리 는 한때 중요 한 역할 이 아니 라 고 생각 했 습 니 다.좋아,주제 에 들 어가 자!같은 파일 에 접근 할 수 있 는 다른 FileStream 대상 을 제어 하 는 데 사용 되 는 상수 가 포함 되 어 있 습 니 다.이 말 이 무슨 뜻 이 죠?솔직히 말 해서,나 는 지금 한 마디 를 보 는 것 이 여전히 매우 복잡 하 다.많은 학우 들 이 보 는 것 도 안개 라 고 믿는다.괜찮아,우리 먼저 뛰 어 넘 자!
image 멤버 들 의 설명 을 보면 FileAccess 과 비슷 하 다.잠시 베일 을 벗 겨 보 자!FileShare.Read 는 말 그대로 파일 을 먼저 열 고(자원 이 방출 되 지 않 음)파일 을 읽 는 방식 으로 파일 에 접근 할 수 없 는 이상 을 던 지지 않 는 다 는 뜻 으로 이해 할 수 있 습 니 다.방금 실현 한 방법 을 이용 하여 쉽게 이 실험 을 완성 할 수 있다.
 
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);
image
이것 은 무슨 일 입 니까?다 읽 은 것 으로 설정 되 어 있 지 않 습 니까?파일 을 읽 을 때 만 읽 기 공유 로 설정 할 수 있 습 니 다.다시 한 번 시도 해 보 겠 습 니 다:
 
ReadFile(FileAccess.Read, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);
image
이번 에는 처음으로 자원 을 방출 하지 않 았 을 때 다시 읽 을 수 있 습 니 다.공유 만 설정 한 후에 파일 을 쓸 수 있 는 지 다시 한번 시도 해 보 겠 습 니 다.
 
ReadFile(FileAccess.Read, FileShare.Read);
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
image
먼저 파일 의 내용 을 정확하게 읽 었 으 나,내 가 어떤 내용 을 쓰 려 고 시 도 했 을 때 또 잘못 보고 했다.그렇다면 이상 의 실험 에 따 르 면 이 읽 기 전용 공 유 는 파일 을 연속 으로 읽 어야 만 유효 하 다 는 것 을 알 수 있 습 니 다!FileShare.Write 는 Read 의 경험 을 결합 하여 파일 을 쓸 때 공유 방식 을 Write 로 설정 해 야 파일 을 계속 쓸 수 있 고 그렇지 않 으 면 이상 을 던 질 수 있다 는 뜻 으로 이해 할 수 있 습 니 다.여기 가 재 미 있 을 때 Write 를 설정 하면 만능 Window 메모 장 도 파일 을 열 수 없습니다.
image
FileShare.ReadWrite 는 이상 의 경험 을 가지 고 있 습 니 다.말 그대로 이 ReadWrite 는 read 와 Write 의 특성 을 결합 한 것 이 라 고 볼 수 있 습 니 다.그럼 도대체 얘 가 무슨 소 용이 있 는 거 야?위 에서 우 리 는 파일 을 읽 을 때 Read 공 유 를 설정 하면 계속 읽 을 수 있 고 쓸 수 없 으 며,파일 을 쓸 때 Write 공 유 를 설정 하면 계속 쓸 수 있 고 읽 을 수 없다 는 것 을 알 고 있 습 니 다.그러나 우리 가 쓰기 공 유 를 설정 한 후에 파일 을 읽 으 려 고 할 때 어떻게 합 니까?자원 을 먼저 방출 하고 다시 불 러 올 수 밖 에 없 나 요?필요 없어,ReadWrite 는 이 때문에 태 어 난 거 야.
 
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.ReadWrite);

image
그러나 파일 을 쓸 때 공 유 를 Write 로 설정 하 는 것 은 허용 되 지 않 습 니 다.그렇지 않 으 면 파일 을 읽 을 때 ReadWrite 를 사용 하면 유효 하지 않 지만 모두 ReadWrite 로 설정 할 수 있 습 니 다.이것 은 반드시 많은 일상 개발 중의 번 뇌 를 해결 할 수 있 을 것 이다.FileShare.None/FileShare.Delete 는 위의 경험 이 있 습 니 다.이 두 가 지 를 쉽게 이해 할 수 있 을 것 이 라 고 믿 습 니 다.None 는 후속 작업 을 허용 하지 않 고 Delete 는 나중에 삭제 작업 을 할 수 있 습 니 다.블랙박스 안의 내용 은 파일 조작 에 있어 우리 가 평소에 사용 하 는 것 이 비교적 많은 것 은 다음 과 같은 몇 가지 일 수 있다.
 
File.AppendAllText("......");
File.AppendAllLines(...);
File.AppendText(...);
FileStream fs = new FileStream(path, FileAccess.Write);
fs.Write(....);
실제로 그들 도 내부 에서 FileMode/FileAccess/FileShare 을 초기 화 했다.예 를 들 어 File 의 정적 방법 은 마지막 에 하나의 Stream 인 스 턴 스 를 생 성 하 는데 그 중에서 개인 적 인 방법 을 사용 했다.
image
마지막 순간 에 우 리 는 알 게 되 었 습 니 다.사실은/FileShare 은 파일 흐름 을 통제 하 는'접근 권한'입 니 다.물론 이것 은 입문 한 파일 조작 일 뿐 입 니 다.자신 이 필 기 를 했 고 여러분 에 게 도움 을 주 었 으 면 합 니 다.고급 편 정원 에 많은 선배 들 이 파일 을 읽 고 자 물 쇠 를 쓰 는 글 을 썼 습 니 다.관심 이 있 는 학생 들 은 검색 해서 참관 하 세 요!저자:공 일운

좋은 웹페이지 즐겨찾기