我正在处理语音记录。 我需要使用.exe文件将Wav转换为.mp3文件。 一切都很好,我可以执行此exe,但是当进程以我的输出.mp3文件结束时,我需要做一些事情。 我知道我的输出目录,但在尚未创建MP3文件之前无法处理。 我知道也许我需要使用Thread.sleep(); 或类似的东西,因为我无法在文件不存在之前捕获它。

这是我的代码:

string mp3GuidName = Guid.NewGuid().ToString();
var mp3FilePath = WavFilePath.Replace("finalWavFile", mp3GuidName).Replace("wav", "mp3");
var extrasFilePath = HttpContext.Current.Server.MapPath("/").Replace("DevApp.Web", "Extras");

string strArguments = "/c start " +  extrasFilePath + "lame.exe --abr 80 -V5 " + WavFilePath + " " + mp3FilePath;

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "cmd.exe";
startInfo.Arguments =  strArguments ;
process.StartInfo = startInfo;
process.Start();
var attactment = new Attachment
    {
        CreatedOn = DateTime.Now,
        UpdatedOn = DateTime.Now,
        Title = mp3GuidName +".mp3",
        Size = _storageProvider.GetFile(mp3FilePath).GetSize(), // here I am trying to get mp3 file but i cant catch it. Because if this wav files size is huge, then convert process is taking time and my mp3 file is not created yet.
        FileExtension = _storageProvider.GetFile(mp3FilePath).GetFileType()
    };
attactment.MimeType = _storageProvider.GetMimeType(attactment.FileExtension);
attactment.FileUrl = mp3GuidName+".mp3";// file.GetName();
attactment.AttachmentFolderId = folder.Id;
_attachmentRepository.Add(attactment);

我试图使用process.WaitForExit(); 但我不能解决这个问题。 我仍然无法访问mp3文件。

那么如何在过程完成时捕获?

最好的祝福。

#1楼 票数:1

从参数字符串中删除start命令参数,您应该可以使用process.WaitForExit(); 等待Lame完成编码:

string strArguments = "/c " +  extrasFilePath + "lame.exe --abr 80 -V5 " + WavFilePath + " " + mp3FilePath;


但是,您可以通过直接启动lame.exe来简化代码并完全避免与cmd.exe发生这种冲突:

string strArguments = "--abr 80 -V5 " + WavFilePath + " " + mp3FilePath;
...
startInfo.FileName = extrasFilePath + "lame.exe";
startInfo.Arguments = strArguments;
...



下面的一些信息说明为什么在您的方案中使用start命令参数会适得其反。

使用cmd.exe(或从控制台或批处理文件)执行控制台应用程序(例如lame.exe)通常会阻塞cmd.exe(或控制台/批处理文件),直到控制台应用程序退出。

但是,使用start命令会将通常阻止控制台程序执行的操作转换为非阻止执行。 使用此参数,在控制台应用程序仍在运行时,cmd.exe(或控制台/批处理文件)将继续执行。 在您的特定情况下,这意味着cmd.exe将在启动lame.exe之后立即退出(因为它没有其他要执行的操作),从而有效地破坏了您等待lame.exe完成的尝试。

#2楼 票数:-1

编辑:

根据下面的评论,我必须明确指出,我建议的原始解决方案不检查文件是否空闲,而是仅检查文件是否存在 因此,我建议以下内容:

private bool IsBusy(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
    }
    catch ()
    {
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }
    return false;
}

用法将是:

while(IsBusy(fileinfo))
{
     //just wait
}

原文:您可以使用while循环来查找文件准备就绪的时间:

while(!File.Exists(mp3FileName))
{
     //just wait
}
// add the attachment here

  ask by Mustafa Alan translate from so

未解决问题?本站智能推荐:

4回复

如何捕获未发送到stdout的命令行文本?

我在项目中使用LAME命令行mp3编码器。 我希望能够看到有人正在使用的版本。 如果我只执行没有参数的LAME.exe,例如: 如果我尝试使用>将输出重定向到文本文件,则文本文件为空。 在c#中使用System.Process运行它时,该文本可从何处访问?
1回复

在C#.aspx页面上通过重定向执行命令提示符中的命令

我正在尝试在.aspx页上的C#代码中的命令提示符下执行命令。 该代码不会引发任何错误,但是该命令不会执行,因为不会生成新文件。 我看不到命令​​本身的任何问题,因为如果我从调试视图复制命令并将其粘贴到命令提示符下,它会很好地执行。 有什么想法为什么我的代码无法生成ResultadoC
2回复

C#开发人员命令提示符

我想使用在DevelopersCommandPrompt中设置的环境变量调用诸如msbuild / dumpbin命令。 我没有使用 C# 的经验,我找不到一种干净的方法来实现这一点。 我想到的是,首先运行Process DevelopersCommandPrompt并读取set命令输出以检索所有流
2回复

无法在C#Windows窗体应用程序VisualStudio2010中隐藏命令提示符

这个问题已经在这里有了答案: 从Process.Start C#隐藏控制台窗口 4个答案 我已在C#视觉工作室2010的应用在本申请中,我发送ping命令来cmd和接收所述的输出cmd在RichTextBox 。 这是我的代码: 我的代码运行良好,但问题是,当我单击sta
2回复

命令将不会在命令提示符中运行

当用户单击按钮时,我希望它运行登录脚本(从服务器启动),但是每台计算机都位于不同的服务器中,因此我获得了服务器名称。 但是netlogon.StartInfo.Arguments = slnres + @"/c \\netlogon\\logon.cmd"; 线无法正常工作。 它应该在PC
5回复

如何在C#中执行cmd,然后在同一窗口中执行另一个命令?

我正在尝试完成的是一个程序,它基本上可以一键设置活动分区,从而节省了使用 cmd 提示符等的工作时间和技巧。 我查看了 System.Management 命名空间,但不知道如何使用它:( 所以我求助于使用 CMD,我有一个用 C# 编写的模块应用程序,基本上我想运行“DISKPART”,然后在 c
1回复

从Cmd提示符重定向输出

编程新手,我正在编写一个应打开cmd提示符的过程,运行命令 然后将标准输出重定向到字符串,以便可以处理数据。 我尝试了各种组合,但是除了最后一行“按任意键关闭”以外,无法使程序输出任何内容。 我感觉好像缺少了一些非常简单的东西,因为我的代码找不到任何错误。 有没有人有什么建议?
1回复

C#更改文件夹并在CMD中启动过程,等待它完成

我需要从Windows窗体应用程序打开一个外部进程。 更重要的是,我需要在应用运行时执行几次。 基本上,我正在命令提示符下多次执行带有参数的.exe文件,但是我需要将文件夹更改为.exe所在的位置,以使其正常工作。 到目前为止,我像这样打开cmd: 然后使用process.WriteL