3

我在 Visual Studio 2010 上创建了一个新项目。它是一个 Windows 窗体,并使用 .NET Framework 4 Client Profile 完成。

我在上面放了一个嵌入的 WAV 声音文件。

我唯一想做的就是将它复制到某个路径,例如桌面。我怎样才能做到这一点?

我已经尝试过这些:

如何从资源中复制文件?

从资源中读取文件并在 C# 中将其写入磁盘

将文件从程序集资源流写入磁盘

然而,我总是面临着麻烦。例如:

如果我添加一个名为 Take Over Control.wav 的音频资源,它的名称会被添加Take_Over_Control。然后,我只需在我的主表单中添加一个按钮,上面写着“复制”。然后,该按钮的点击事件有:

private void ButtonCopyClick(object sender, EventArgs e)
{
    Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("Take_Over_Control");
    if (resource == null)
    {
        throw new ArgumentException();
    }
    Stream output = File.OpenWrite(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)+"\\Sound.wav");
    resource.CopyTo(output);
}

问题是......无论我是否在该部分中放置Take_Over_ControlorResources.Take_Over_ControlProperties.Resources.Take_Over_Control等,GetManifestResourceStream我总是卡在throw new ArgumentException();,所以,这意味着它resourcenull,并且它没有很好地分配Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("Take_Over_Control");在线。

我尝试过的其他方法也有问题。这里有什么问题?如何以正确的方式复制这个嵌入的音频文件!?

4

4 回答 4

2

首先,您确定您的 WAV 文件是“构建操作”属性下的嵌入式资源吗?如果是这样,看起来您的 WAV 文件路径可能是错误的。线...

Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("Take_Over_Control");

应该

Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("myProject.resources.Take_Over_Control.wav");

其中 myProject 是项目的名称,resources 是保存 WAV 文件的文件夹。因此,如果这是您的 wav 文件的路径,则上面的代码将适用...“c:\myProject\resources\Take_Over_Control.wav

希望有帮助

于 2012-04-19T01:18:21.017 回答
1

在寻找 Resources.Designer.cs 文件时,我看到了 ResourceManager.GetStream... 所以,我现在在点击事件中使用它:

Stream resource = Properties.Resources.ResourceManager.GetStream("Take_Over_Control");
if (resource == null)
{
    throw new ArgumentException();
}
Stream output = File.OpenWrite(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)+"\\Sound.wav");

它只是将 WAV 文件复制到桌面的正确工作。还有……现在我没有反思了!

需要注意的是,当 WAV 文件添加到 Visual Studio 2010 C# .NET Framework 4 客户端配置文件项目时,它不是另存为byte[],而是另存为UnmanagedMemoryStream. 正因为如此,需要将其转换为byte[]或只是将其放入Streamvia ResourceManager,并且,ResourceManager方式更短!

于 2012-04-19T15:09:13.163 回答
0

有时,此代码的资源为 null:

Stream resource = Properties.Resources.ResourceManager.GetStream("ResourceFileName");

但是我们可以使用此代码而不是受赠者将您的资源返回给流变量

Stream resource = Properties.Resources.ResourceManager.GetStream("ResourceFileName") 
于 2013-03-07T16:46:17.617 回答
0

您不需要这样做:Properties.Resources.ResourceManager.GetStream

如果你在 VS.NET 中使用资源编辑器,只需将你的 wav 文件拖到那里。然后,您将生成一个 Resources 类。

从那里,您只需要将Resources.MySound流复制到FileStream

var path = "c:\\temp\\MySound.wav";
using (var fs = new FileStream("c:\\temp\\sound.wav", FileMode.Create))
{
   Resources.MySound.CopyTo(fs);
}
Process.Start(path);
于 2012-04-19T06:41:17.083 回答