0

이 질문에는 이미 답변이 있습니다.

코드에서 코드를 열 때FileMp3Reader, 그 단어를 사용한다.Action그런 다음 람다 (Lambda) 표현식을 사용하여 내부에 배치됩니다.

키워드는 무엇입니까?Action? 내부file.Create방법은 무엇을하고 있는가?

var mp3Path = @"C:\Users\ronnie\Desktop\mp3\dotnetrocks_0717_alan_dahl_imagethink.mp3";
int splitLength = 120;


var mp3Dir = Path.GetDirectoryName(mp3Path);
var mp3File = Path.GetFileName(mp3Path);
var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path));
Directory.CreateDirectory(splitDir);

int splitI = 0;
int secsOffset = 0;

using (var reader = new Mp3FileReader(mp3Path))
{   
    FileStream writer = null;      
    Action createWriter = new Action(() => {
        writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
    });

    Mp3Frame frame;
    while ((frame = reader.ReadNextFrame()) != null)
    {           
        if (writer == null) createWriter();

        if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength)
        {   

            writer.Dispose();
            createWriter();
            secsOffset = (int)reader.CurrentTime.TotalSeconds;              
        }

        writer.Write(frame.RawData, 0, frame.RawData.Length);
    }

    if(writer != null) writer.Dispose();
}


  • 단일 매개 변수를 가지며 값을 반환하지 않는 메서드를 나타내는 해당 형식입니다. - Khan
  • 람다 표현식과 델리게이트 타입에 대해 배워야합니다. - SLaks
  • 대의원 :msdn.microsoft.com/en-us/library/… - Guffa
  • 키워드는 아닙니다. 그것은 유형의 이름입니다. - Servy

1 답변


1

의견에 언급 된 바와 같이,Action여기에 대리자 유형이 있습니다. 변수 선언문에 배치 된 상황을 고려할 때 아마도 많은 독자가이 문맥에서 추측 할 수 있습니다. :)

코드는File.Create()메소드는 단순히 파일 이름을 기반으로 새 파일 이름을 생성합니다.splitI색인.

아이러니하게도,이 특별한 경우에,Action불필요합니다. 위임자는 읽기가 더 어려워 지므로이 코드는 실제로 작성되지 않아야합니다. 더 나은 버전은 다음과 같습니다.

using (var reader = new Mp3FileReader(mp3Path))
{
    FileStream writer = null;      

    try
    {
        Mp3Frame frame;
        while ((frame = reader.ReadNextFrame()) != null)
        {           
            if (writer != null &&
                (int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength)
            {   
                writer.Dispose();
                writer = null;
                secsOffset = (int)reader.CurrentTime.TotalSeconds;              
            }

            if (writer == null)
                writer = File.Create(Path.Combine(splitDir,
                    Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));

            writer.Write(frame.RawData, 0, frame.RawData.Length);
        }
    }
    finally
    {
        if(writer != null) writer.Dispose();
    }
}

그렇게하면, 새로운 것을 창조하는 일FileStream인스턴스는 한 곳에서만 필요합니다.

두 곳의 다른 장소에서 실제로 호출해야 할 필요가 있다고하더라도, IMHO에서는이 특정 시나리오가 대신 명명 된 메소드를 호출합니다. 이 코드는 위임 인스턴스를 사용하는 것보다 더 읽기 쉽습니다.


  • 니가 너와 다른 뭔가를하고 있다고 생각 했어, 네. - Servy
  • 나는이 코드에 대해 많은 질문을 던지 겠지만, 특히 나는 다음과 같은 것을 가지고있다.Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3"))); - missenna
  • @missenna : 죄송합니다. 질문을 이해할 수 없습니다. 해당 코드 행은 원래 코드에서 그대로 복사됩니다. 그것은 원래 코드에서했던 것처럼 나의 예제에서도 똑같은 일을합니다. - Peter Duniho
  • 예, 맞습니다.하지만 문제는 원래 코드에서 이해할 수없는 것입니다. :) - missenna
  • 아. 글쎄, 그건 완전히 다른 질문 인 것 같아. 그러나 짧은 버전은 다음과 같습니다.splitI) 형식의 파일 이름을 만드는 데 사용됩니다<original name>XXXX.mp3어디에<original name>물론 원본 파일의 이름입니다.XXXX는 쓰여지는 세그먼트의 4 자리, 제로 패딩 인덱스이며, 물론.mp3확장자입니다. 이렇게하면 루프가 원본 단일 파일을 부분 세그먼트로 작성하고 각 MP3 클립은splitLength초. 그것보다 더 필요하다면 구체적인 질문을하는 다른 질문을 게시해야합니다. - Peter Duniho

연결된 질문


관련된 질문

최근 질문