문제

테스트 벤치의 일부로 사용하는 .CSV 파일이 있습니다. 나는 그들을 열어서 아무런 문제없이 읽을 수 있습니다 ~하지 않는 한 나는 이미 Excel에 파일을 열었습니다. IOException:

System.io.ioexception : 프로세스는 다른 프로세스에서 사용되기 때문에 'testdata.csv'파일에 액세스 할 수 없습니다.

이것은 테스트 벤치의 스 니펫입니다.

using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read)), false))
{
    // Process the file
}

스트리트 리더의 한계입니까? 다른 응용 프로그램 (예 : 메모장 ++)에서 파일을 열 수 있으므로 O/S 문제가 될 수 없습니다. 다른 수업을 사용해야할까요? 누군가 내가 이것을 어떻게 돌릴 수 있는지 아는 사람이라면 (엑셀을 닫는 것 외에도!) 나는 매우 감사 할 것입니다.

도움이 되었습니까?

해결책

Jared가 말했듯이 파일이 열린 다른 엔티티가 공유 읽기를 허용하지 않는 한이 작업을 수행 할 수 없습니다. Excel은 공유 읽기를 허용하며, 글쓰기를 위해 열려있는 파일의 경우에도 공유 읽기를 허용합니다. 따라서, 당신은 fileshare.ReadWrite 매개 변수.

Fileshare Param은 종종 오해됩니다. 그것은 무엇을 나타냅니다 다른 파일의 오프너가 할 수 있습니다. 그것은 미래의 오프너뿐만 아니라 과거에도 적용됩니다. Fileshare는 이전 오프너 (예 : Excel)에 대한 소급 금지가 아니라 현재 오픈 또는 미래의 열린 상황에 위반해서는 안되는 제약 조건을 생각하십시오.

현재 파일을 열려는 시도의 경우, Fileshare.Read는 "이전 오프너가 열린 경우에만 성공적 으로이 파일을 여는 것입니다. "excel로 쓸 수있는 파일을 Fileshare.Read를 지정하면 읽기." 당신의 Excel이 열려 있기 때문에 제약을 위반할 때 오픈이 실패합니다. 글쓰기를 위해.

Excel은 쓰기를 위해 파일이 열려 있기 때문에 원하는 경우 fileshare.readwrite로 파일을 열어야합니다. 당신의 성공하기 위해 열려 있습니다. Fileshare Param을 생각하는 또 다른 방법 : "다른 사람의 파일 액세스"를 지정합니다.

이제 다른 앱에서 열리지 않은 파일을 열 수있는 다른 시나리오를 가정 해 봅시다. Fileshare.Read는 "미래의 오프너는 읽기 액세스로 만 파일을 열 수 있습니다"라고 말합니다.

논리적으로, 이러한 의미론은 의미가 있습니다 -Fileshare.Read는 다른 사람이 이미 글을 쓰고 있다면 파일을 읽고 싶지 않으며 이미 읽고있는 경우 다른 사람이 파일을 작성하는 것을 원하지 않습니다. fileshare.readwrite는 다른 사람이 작성하는 경우에도 파일을 기꺼이 읽을 것이며, 다른 오프너가 파일을 읽는 동안 파일을 작성하는 데 아무런 문제가 없습니다.

어떠한 경우에도 이것은 여러 작가를 허용하지 않습니다. Fileshare는 데이터베이스 분리 레벨과 유사합니다. 여기서 원하는 설정은 필요한 "일관성"보증에 따라 다릅니다.

예시:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

또는,

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

부록:

그만큼 System.IO.Fileshare에 대한 문서 약간 슬림합니다. 똑바로 사실을 얻으려면 Win32 CreateFile 함수에 대한 문서, Fileshare 개념을 더 잘 설명합니다.

다른 팁

편집하다

왜 이것이 왜 답이 답인지 확신하지는 않지만 Fileshare.ReadWrite를 FileStream 생성자에게 전달 하여이 문제를 해결할 수 있습니다.

using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)), false)
{
  ...
}

내 호기심은 현재 나를 붙잡고 있으며 이것이 왜 이것이 특별한 대답인지 이해하려고 노력하고 있습니다. 나중에 알아 내면 정보로 이것을 업데이트하겠습니다.

최고의 문서는 실제로있는 것으로 보입니다 CreateFile 기능. 이것은 파일을 열기 위해 .NET가 후드 아래에서 호출하는 함수입니다 (파일 작성은 약간의 오해입니다). 파일 열기의 공유 측면이 작동하는 방법에 대한 더 나은 문서가 있습니다. 또 다른 옵션은 Cheeso의 대답을 읽는 것입니다

다른 프로세스에 파일이 열려 있으면 종종 파일을 사용하고 사본을 열 수 있습니다. 우아한 솔루션이 아니라 실용적인 솔루션.

또 다른 캐치는 당신이 열면 a FileStream ~와 함께 FileShare.ReadWrite, 해당 파일의 후속 old는 또한 지정해야합니다 FileShare.ReadWrite, 또는 '다른 프로세스 가이 파일을 사용하고 있습니다'오류가 발생합니다.

System.Diagnostics 사용;

단순히 Process.Start ( "Filename & Path")를 호출 할 수 있습니다.

그것이 도움이 될지 확실하지 않지만 그것이 인트라넷에서 미리보기 PDF 버튼을 구현하는 데 사용했던 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top