이 질문에는 이미 답변이 있습니다.
코드에서 코드를 열 때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();
}
의견에 언급 된 바와 같이,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에서는이 특정 시나리오가 대신 명명 된 메소드를 호출합니다. 이 코드는 위임 인스턴스를 사용하는 것보다 더 읽기 쉽습니다.
Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
- missennasplitI
) 형식의 파일 이름을 만드는 데 사용됩니다<original name>XXXX.mp3
어디에<original name>
물론 원본 파일의 이름입니다.XXXX
는 쓰여지는 세그먼트의 4 자리, 제로 패딩 인덱스이며, 물론.mp3
확장자입니다. 이렇게하면 루프가 원본 단일 파일을 부분 세그먼트로 작성하고 각 MP3 클립은splitLength
초. 그것보다 더 필요하다면 구체적인 질문을하는 다른 질문을 게시해야합니다. - Peter Duniho