1

圧縮されていない.wavファイルを取得し、flacファイル、mp3ファイル、およびaacファイルにエンコードするアプリを作成しました。flacとmp3は正常に動作しますが、( Nero AACエンコーダーを使用して)aacエンコードを実行すると、使用中のファイルに関するIOExceptionがランダムに発生します。時々-しかしそれほど頻繁ではありません-それはファイルが生成されている間に起こります-私のプロセスが作成したファイルを他の人がどのように使用することができますか?しかし、TagLibを使用してメタタグを作成すると、エラーが発生することがよくあります。そのため、IOエラーが発生したときに、問題のファイルでsysinternalのhandle.exeを実行するようにコードを調整しましたが、ファイルにハンドルがないという事実が返されます。これは、Nero aacエンコーダーに固有の問題ですか?

try
{
if ( ! Directory.Exists( es.dest ) )
    {
        Directory.CreateDirectory( Path.GetDirectoryName( es.dest ) );
    }
    if ( File.Exists( es.dest ) ) { File.Delete( es.dest ); }
    bool CommandGenerated = enc.GenerateCommandLine();

    string procOutput = String.Empty;
    if ( CommandGenerated )
    {
        Console.Out.WriteLine( "Starting:" );
        p = new Process();
        p.StartInfo.WorkingDirectory = Path.GetDirectoryName( current_config_exe );
        p.StartInfo.FileName = current_config_exe;
        p.StartInfo.Arguments = enc.ToString();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();

        procOutput = p.StandardOutput.ReadToEnd();
        p.WaitForExit();
        int exit_code = p.ExitCode;
        p.Close();
        p.Dispose();
        string exit_msg = "Encoder exitcode: " + exit_code + "\n";
        if ( exit_code != 0 )
        {
            Console.WriteLine( "There was a problem. Do you want to continue? (y/n) (Default = y)" );
            string response = Console.ReadLine();
            if ( response.ToLower() == "n" )
            {
                throw new Exception( "Note: " + exit_msg );
            }
        }
        else if ( es.use_taglib_for_meta && enc.metaswitches != null )
        {
            Meta meta = new Meta( es.dest );
            if ( meta.SetMetaTags( enc.metaswitches, true ) )
            {
                WriteLog( "Meta tags successfully wriiten to: \n" + es.dest, true, false );
            }
            else
            {
                WriteLog( "Meta tags NOT wriiten to: " + es.dest, true );
            }
        }
    }
}
catch ( IOException ex )
    {
        Handler.GetHoldingProcess( es.dest );
        Program.WriteLog( "(writing track to file) Error saving file " + es.dest + ":\n" + ex, true );
        return false;
    }
4

1 に答える 1

1

他のSysInternalsツール--filemon.exeをお勧めします

  1. IOExceptionを文句を言うメソッドにブレークポイントを設定します
  2. VSからデバッグモードでアプリケーションを実行します
  3. VSがブレークポイントで停止した場合-filemon.exeを起動します
  4. VSでF5を押します(実行を続行します)
  5. 例外が発生した場合-filemon.exeを一時停止し、ファイルで何が起こっているかを分析し始めます

調査を簡素化するために、ファイルまたはプロセス名ごとにfilemonにフィルターを設定できます。頑張ってください。

于 2011-08-13T19:06:25.490 に答える