この質問にはすでに答えがあります。
あなたのコードでは、あなたが開いたとき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
インスタンスは一箇所でしか必要とされません。
たとえそれが2つの異なる場所からそれを呼び出すことが本当に必要であったとしても、私見この特定のシナリオは代わりに名前付きメソッドを要求するでしょう。このコードは、デリゲートインスタンスを使用するよりも読みやすくなっています。
Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
- missennasplitI
)という形式のファイル名を作成するために使用されます。<original name>XXXX.mp3
どこで<original name>
もちろん元のファイルの名前です。XXXX
書き込まれているセグメントの4桁のゼロ詰めインデックスであり、もちろん.mp3
拡張子です。これにより、ループはオリジナルの単一のファイルを部分的なセグメントとして書き出すことができます。splitLength
すぐに。それ以上のものが必要な場合は、詳細を尋ねる別の質問を投稿してください。 - Peter Duniho