2012-10-05 3 views
12

또한 Excel에서 열린 텍스트 파일의 모든 행을 string[]으로 IO 예외가 발생하지 않고 읽으려면 어떻게해야합니까? How do I open an already opened file with a .net StreamReader?Excel에서도 열려있는 파일에서 File.ReadAllLines을 수행하려면 어떻게합니까?

+0

링크 된 답변에 대해 이해할 수없는 점은 무엇입니까? 그것은 꽤 분명하다. 너 해봤 어? 코드를 보여줍니다. – Polyfun

+0

'string [] lines'을 텍스트 파일의 행으로 채우려면 어떻게해야합니까? 거기에 대해서는 아무 것도 없습니다. – user1306322

+0

http://stackoverflow.com/questions/3560651/whats-the-least-invasive-way-to-read-a-locked-file-in-c-sharp-perhaps-in-unsaf – m0s

답변

30

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가하는 것입니다 다른 응용 프로그램에서 읽기/쓰기 권한으로 열려있을 때도 마찬가지입니다.

이제 다른 응용 프로그램이 파일에 대한 쓰기 권한을 가지고 있기 때문에 복잡 할 수 있으므로이 문제가 발생할 수 있음을 이해해야합니다.

  1. 당신은 파일의 마지막으로 저장된 버전을 읽기 위하여려고하고있다, 그래서 당신은 Excel에서 저장되지 않은 변경 사항이있는 경우이 방법이있는 동안 Excel에서 파일을 저장하면,이 방법은 그들에게
  2. 을 읽지 않습니다 그것을 읽고있는 중간에 상황에 따라 예외가 발생할 것입니다. 파일을 저장하는 동안 파일이 완전히 잠겨 있기 때문에 잠긴 상태에서 파일을 읽으려고하면 System.IO.IOException이 표시됩니다.
  3. 파일을 저장하고 예외를 피할 수 있으면 (극히 드물지만 특정 타이밍에 가능할 수 있음) 원본 파일이 아닌 새로 저장된 파일을 읽게됩니다. 그것은 다른 응용 프로그램 작성을위한 열려있을 때 파일을 읽을 수없는 이유

이해하려면, .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을 지정해야합니다. 이는 위의 솔루션에서 수행 한 작업입니다.

+0

이것은 많은 의미를 지니고 있으며 지금 당장은 작동한다고 저는 믿을 것입니다. – user1306322

+0

@ user1306322 그것은 나를 위해 일했습니다. 방금 열어 본 CSV를 읽는 것과 똑같은 문제가 생겼습니다. 질문에 답을 찾았지만 대답이 만족스럽지 않았습니다. 따라서 합병증이 있으면 (제가 언급 한 것과는 별도로) 알려주십시오. – psubsee2003

1

이 시도 :

내가 거기에 무엇을 사용할 수있는 방법을 알고하지 않습니다하지만, 대답의 일부가 될 수있는이 질문입니다.

FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, 
System.IO.FileShare.ReadWrite) 
+2

'string [] lines = something.ReadAllLines (myPath)'를 어떻게하면 되나요? – user1306322

+0

텍스트 파일에서 줄을 읽는 데 필 스트림이 필요한지 확실하지 않습니다. 이것을 할 수있는 다른 방법이 있습니까? – user1306322

1

읽기 제한으로 열 때 파일을 열 수 없습니다. 그렇지 않으면 ReadAllLines을 포함한 모든 메소드가 허가 예외를 발생시키지 않고 작동합니다.

관련 문제