또한 Excel에서 열린 텍스트 파일의 모든 행을 string[]
으로 IO 예외가 발생하지 않고 읽으려면 어떻게해야합니까? How do I open an already opened file with a .net StreamReader?Excel에서도 열려있는 파일에서 File.ReadAllLines을 수행하려면 어떻게합니까?
답변
Excel에서 파일을 읽기/쓰기로 엽니 다. File.ReadAllLines()
은 다른 응용 프로그램에서 쓰기 위해 열려있을 때 파일에 액세스 할 수 없습니다. Excel에서 csv를 읽기 전용으로 연 경우이 예외가 발생하지 않습니다.
.Net의 구현이 다른 응용 프로그램에 쓰기 권한이있는 경우 파일에 액세스 할 수있는 적절한 권한으로 내부 스트림을 열지 않기 때문입니다.
여기 수정은 간단한 Stream
을 시작할 때 적절한 사용 권한을 설정하는 사용자 고유의 ReadAllLines()
메서드를 작성하십시오. 여기
ReadAllLines()
자체에 무엇을에서 많이 빌려 아이디어입니다 :
public string[] WriteSafeReadAllLines(String path)
{
using (var csv = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var sr = new StreamReader(csv))
{
List<string> file = new List<string>();
while (!sr.EndOfStream)
{
file.Add(sr.ReadLine());
}
return file.ToArray();
}
}
이와 사이의 유일한 차이 FileShare
권한은 파일을 열 수 있습니다 FileShare.ReadWrite
로 설정되어있는 것을 ReadAllLines
가하는 것입니다 다른 응용 프로그램에서 읽기/쓰기 권한으로 열려있을 때도 마찬가지입니다.
이제 다른 응용 프로그램이 파일에 대한 쓰기 권한을 가지고 있기 때문에 복잡 할 수 있으므로이 문제가 발생할 수 있음을 이해해야합니다.
- 당신은 파일의 마지막으로 저장된 버전을 읽기 위하여려고하고있다, 그래서 당신은 Excel에서 저장되지 않은 변경 사항이있는 경우이 방법이있는 동안 Excel에서 파일을 저장하면,이 방법은 그들에게
- 을 읽지 않습니다 그것을 읽고있는 중간에 상황에 따라 예외가 발생할 것입니다. 파일을 저장하는 동안 파일이 완전히 잠겨 있기 때문에 잠긴 상태에서 파일을 읽으려고하면
System.IO.IOException
이 표시됩니다. - 파일을 저장하고 예외를 피할 수 있으면 (극히 드물지만 특정 타이밍에 가능할 수 있음) 원본 파일이 아닌 새로 저장된 파일을 읽게됩니다. 그것은 다른 응용 프로그램 작성을위한 열려있을 때 파일을 읽을 수없는 이유
이해하려면, .NET의 실제 구현을보고있다. (이것은 .Net 4.5의 구현이므로 .Net의 차이점을보고 있다면 약간 다를 수 있습니다).무엇 StreamReader
에서 훔쳐 내부적하고있다
public static string[] ReadAllLines(string path)
{
if (path == null)
throw new ArgumentNullException("path");
if (path.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
else
return File.InternalReadAllLines(path, Encoding.UTF8);
}
private static string[] InternalReadAllLines(string path, Encoding encoding)
{
List<string> list = new List<string>();
using (StreamReader streamReader = new StreamReader(path, encoding))
{
string str;
while ((str = streamReader.ReadLine()) != null)
list.Add(str);
}
return list.ToArray();
}
그리고 :
internal StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool checkHost)
{
if (path == null || encoding == null)
throw new ArgumentNullException(path == null ? "path" : "encoding");
if (path.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
if (bufferSize <= 0)
throw new ArgumentOutOfRangeException("bufferSize", Environment.GetResourceString("ArgumentOutOfRange_NeedPosNum"));
this.Init((Stream) new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost), encoding, detectEncodingFromByteOrderMarks, bufferSize, false);
}
을 그래서 여기에 우리가 예외가 던져 때입니다 이유에 와서
는이 같은 File.ReadAllLines()
실제로 모습입니다 StreamReader
은 매개 변수가 Read
으로 설정된 FileStream
을 만듭니다. 즉, 파일에 대한 읽기/쓰기 권한이있는 다른 응용 프로그램과 파일을 공유 할 수 없습니다. 이 동작을 재정의하려면 FileShare
에 대해 다른 설정으로 Stream
을 지정해야합니다. 이는 위의 솔루션에서 수행 한 작업입니다.
이것은 많은 의미를 지니고 있으며 지금 당장은 작동한다고 저는 믿을 것입니다. – user1306322
@ user1306322 그것은 나를 위해 일했습니다. 방금 열어 본 CSV를 읽는 것과 똑같은 문제가 생겼습니다. 질문에 답을 찾았지만 대답이 만족스럽지 않았습니다. 따라서 합병증이 있으면 (제가 언급 한 것과는 별도로) 알려주십시오. – psubsee2003
이 시도 :
이
내가 거기에 무엇을 사용할 수있는 방법을 알고하지 않습니다하지만, 대답의 일부가 될 수있는이 질문입니다.FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,
System.IO.FileShare.ReadWrite)
'string [] lines = something.ReadAllLines (myPath)'를 어떻게하면 되나요? – user1306322
텍스트 파일에서 줄을 읽는 데 필 스트림이 필요한지 확실하지 않습니다. 이것을 할 수있는 다른 방법이 있습니까? – user1306322
읽기 제한으로 열 때 파일을 열 수 없습니다. 그렇지 않으면 ReadAllLines
을 포함한 모든 메소드가 허가 예외를 발생시키지 않고 작동합니다.
- 1. SQL에서이 쿼리에서 피벗을 수행하려면 어떻게합니까?
- 2. 플래시 클라이언트로 세션을 수행하려면 어떻게합니까?
- 3. CMS의 WebForms에서 라우팅을 수행하려면 어떻게합니까?
- 4. Flash Builder 4.6에서 프로젝트 전반의 찾기/바꾸기를 수행하려면 어떻게합니까?
- 5. Linux 커널에서 표준 라이브러리 호출을 수행하려면 어떻게합니까?
- 6. SDL을 사용하여 키 반복을 동시에 수행하려면 어떻게합니까?
- 7. Firebird의 명령 줄 제거를 수행하려면 어떻게합니까?
- 8. numpy 배열에서 조건부 배열 산술을 수행하려면 어떻게합니까?
- 9. JSON : 도메인 간 JSON 호출을 수행하려면 어떻게합니까
- 10. EF 쿼리에서 날짜 비교를 수행하려면 어떻게합니까?
- 11. 피들러 JScript.NET 함수에서 PInvoke를 수행하려면 어떻게합니까?
- 12. Java에서 다음과 같은 기능을 수행하려면 어떻게합니까?
- 13. IronPython/Silverlight에서 가져 오기 후크를 수행하려면 어떻게합니까?
- 14. 회전 된 사각형에서 충돌 감지를 수행하려면 어떻게합니까?
- 15. 두 벡터에 대해 MATLAB에서 XOR을 수행하려면 어떻게합니까?
- 16. MoreUnit을 실행하지 않고 디버그 테스트를 수행하려면 어떻게합니까?
- 17. 그래디언트 배경에 그림자가있는 텍스트 그라디언트를 수행하려면 어떻게합니까?
- 18. '파일에서 찾기'를 사용하여 델파이에서 'AND'검색을 수행하려면 어떻게해야합니까?
- 19. info.plist 파일에서 App 번들 경로를 찾으려면 어떻게합니까?
- 20. 파일에서 특정 데이터를 추출하려면 어떻게합니까?
- 21. jQuery 숨기기/표시 기능을 사용하여 "뒤로 단추"작업을 수행하려면 어떻게합니까?
- 22. SSE를 사용하여 8 x 8 매트릭스 작업을 수행하려면 어떻게합니까?
- 23. CakePHP. 다른 기본 키가있는 테이블에서 모델 테스트를 수행하려면 어떻게합니까?
- 24. 수리 이외의 모든 상황에서 InstallShield에서 특정 작업을 수행하려면 어떻게합니까?
- 25. WPF : List 또는 Grid에서 항목의 사용자 정의 렌더링을 수행하려면 어떻게합니까?
- 26. Ruby on Rails에서 전체 텍스트 검색을 수행하려면 어떻게합니까?
- 27. MS SQL Server에서 강제로 인덱스 참가를 수행하려면 어떻게합니까?
- 28. PHP 배열 값의 하위 집합을 asort와 같은 작업을 수행하려면 어떻게합니까?
- 29. 문자열의 다른 모든 문자에 대해 작업을 수행하려면 어떻게합니까?
- 30. Ruby 1.9를 사용하여 DNS 영역 전송 (AXFR)을 수행하려면 어떻게합니까?
링크 된 답변에 대해 이해할 수없는 점은 무엇입니까? 그것은 꽤 분명하다. 너 해봤 어? 코드를 보여줍니다. – Polyfun
'string [] lines'을 텍스트 파일의 행으로 채우려면 어떻게해야합니까? 거기에 대해서는 아무 것도 없습니다. – user1306322
http://stackoverflow.com/questions/3560651/whats-the-least-invasive-way-to-read-a-locked-file-in-c-sharp-perhaps-in-unsaf – m0s