C# 如何使用Windows窗体和C将嵌入的音乐文件复制到路径#

C# 如何使用Windows窗体和C将嵌入的音乐文件复制到路径#,c#,winforms,copy,C#,Winforms,Copy,我在VisualStudio2010上做了一个新项目。这是一个Windows Forms one,使用.NET Framework 4客户端配置文件完成 我在上面放了一个嵌入的WAV声音文件 我唯一想做的就是把它复制到某个路径,比如说桌面。我怎样才能做到这一点 我已经试过了: 然而,我总是面临麻烦。例如: 如果我添加了一个名为Take Over Control.wav的音频资源,它的名称是Take Over\u Control。然后,我只是在我的主窗体中添加一个按钮,上面写着“复制”。然后

我在VisualStudio2010上做了一个新项目。这是一个Windows Forms one,使用.NET Framework 4客户端配置文件完成

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

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

我已经试过了:

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

如果我添加了一个名为Take Over Control.wav的音频资源,它的名称是
Take Over\u 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);
}
问题是。。。无论我是放置
接管控制
还是
资源。接管控制
还是
属性。资源。接管控制
等等,在
GetManifestResourceStream
部分,我总是停留在
抛出新参数异常(),因此,这意味着
资源
空的
,并且在
流资源=Assembly.getExecutionGassembly().GetManifestResourceStream(“接管控制”)


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

首先,您是否确保您的WAV文件是“Build Action”属性下的嵌入式资源?如果是这样的话,看起来您的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\u Over\u Control.wav


希望这对您有所帮助:
Properties.Resources.ResourceManager.GetStream

var path = "c:\\temp\\MySound.wav";
using (var fs = new FileStream("c:\\temp\\sound.wav", FileMode.Create))
{
   Resources.MySound.CopyTo(fs);
}
Process.Start(path);
如果您使用的是VS.NET中的资源编辑器,只需将wav文件拖到其中,就可以生成一个资源类

从那里,您只需将
Resources.myound
流复制到
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);

在查找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[]
或通过
ResourceManager
将其放入
流中,并且,
ResourceManager
方式更短!

有时此代码对于资源为空:

Stream resource = Properties.Resources.ResourceManager.GetStream("ResourceFileName");
但是我们可以使用此代码而不是被授权人的代码将您的资源返回到流变量

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

Aja,明白了。我的项目名是
FilesOnResources
,我尝试了
FilesOnResources.Resources.Take_Over_Control
,还有
FilesOnResources.Properties.Resources.Take_Over_Control
,但它不起作用。请注意,我希望我的代码即使在资源文件夹不存在的情况下也能起作用t和我只有EXE文件,而且,正如我所注意到的,如果资源文件夹不存在,您的观察将不起作用。请记住,WAV文件嵌入到EXE资源中,因此,必须有一种方法可以在不需要资源文件夹的情况下拉取它…!此外,我已经做了一些测试,以检查资源是否可访问,并且它是否可用。我已通过
System.Media.SoundPlayer sp=new SoundPlayer(Properties.Resources.Take_Over_Control);
将System.Media.SoundPlayer转到资源,然后,
sp.Play()猜一猜…它在播放什么!你不会相信我的…我没有意识到我可以回答我自己的问题!在我找到答案的路上!哇,收到了这个:哦!你的答案无法提交,因为:•声誉低于100的用户在问完问题后8小时内无法回答他们自己的问题。你可以在4小时内自我回答。在那之前请使用评论,或者编辑你的问题。我会确保当我通过8小时的限制在这里添加这些答案。酷,我的+1将帮助你达到100分:)抱歉编辑太晚,谢谢你的+1!我误解了错误消息。我必须等8小时才能回答,因为我没有100+代表…我会在那时候回答我被pased!你用声音文件试过了吗?当然?因为它不是保存为
字节[]
,而是保存为
非托管内存流
…我试着将其转换为
字节[]
,但最后,
ResourceManager
很短,所以它是一个流,这使得它更简单。我仍然认为您最好使用生成的类,因为您可以进行编译时检查。使用完整的工作示例代码更新答案。仍然更喜欢我的两行代码:P.
stream resource=Properties.ResourceManager.getStream(“接管控制”);
流输出=File.OpenWrite(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)+“\\Sound.wav”)
好吧,你必须做你认为正确的事情,当然:p只是要知道,如果你更改了资源的名称,你必须更改你的代码,直到运行时你才会发现。如果你使用生成的资源类,你会得到编译时检查。你仍然可以用两行代码来完成。嗯……不确定你的情况如何,但是在我的视觉上io 2010 Ultimate它向我报告这种错误,并给出非常具体的报告,即使是我的代码。。。!