2016-09-01 8 views
1
var outputfile = "outputfile.aac";  
var fileList = new List<string> 
       { 
        "1.aac", 
        "2.aac", 
        "3.aac", 
        "4.aac", 
        "5.aac", 
        "6.aac" 
       }; 

       foreach (var file in fileList) 
       { 
        using (var stream = new FileStream(outputfile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) 
        { 
         var bytes = File.ReadAllBytes(file); 
         stream.Write(bytes, 0, bytes.Length); 
         stream.Flush(); 
        } 
       } 

fileList의 aac 파일을 outputfile에 결합하려고합니다. outputfile.aac에 파일 "3.aac"을 쓸 때 MediaPlayer로 outputfile을 열면 FileStream은 예외로 "file in use"를 반환하고 FileShare 모드는 ReadWrite이기 때문에 다른 프로세스가 파일을 읽고 쓸 수 있음을 의미합니다. 이유는 무엇입니까?aac에 바이트를 추가하는 동안 aac을 재생하는 중 "file in use"오류가 발생했습니다.

그러나,이 경우 출력 파일

Stream s = resp.GetResponseStream(); 
        var fs = File.Exists(outputFile) ? new FileStream(outputFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite) 
         : new FileStream(outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 

        byte[] buffer = new byte[4096]; 
        while (s.CanRead) 
        { 
         int bytesRead = s.Read(buffer, 0, buffer.Length); 
         fs.Write(buffer, 0, bytesRead); 
        } 

P/s의 차단되지 않은 : 당신은 당신이 파일의 이후 개방을 허용 FileShare.ReadWrite 사용할 때 이유는 AAC 파일

+0

''3.mp3 "을 outputfile.mp3에 쓸 때 MediaPlayer로 출력 파일을 엽니 다. - Visual Studio에서 또는 그 이후의 명령문을 사용하여 실행하기 전에 outputfile.mp3 파일을여시겠습니까? – RBT

+0

덧붙여서,이 경우에는 Flush()와 Using을 모두 할 필요가 없습니다. – EJoshuaS

+0

문제를 재현 할 수 없습니다. VLC 미디어 플레이어를 사용하여 파일 출력 파일을 엽니 다. 다른 음악 플레이어를 사용했기 때문에 어떤 차이가 있는지 확실하지 않습니다. – RBT

답변

2

때문에 발견 읽기 또는 쓰기 모드.

그러면 MediaPlayer가 FileShare.Read이라는 파일을 열어 파일에 대한 쓰기 권한을 거부합니다.

+0

두 번째 사례의 이유와 MediaPlayer가 쓰기 권한을 잠그지 못하게하는 방법을 알고 계십니까? –

+0

@ HoàngTrầnHuy 당신은 괜찮은 미디어 플레이어도 마찬가지입니다. 처음부터 그렇게하려는 이유에 대해 다시 생각해 봐야합니다. –