2012-04-19 21 views
2

Visual Studio 2010で新しいproyectを作成しました。これはWindowsフォームのもので、.NET Framework 4 Client Profileを使用しています。WindowsフォームとC#を使用して埋め込み音楽ファイルをパスにコピーする方法

私はWAVサウンドファイルを埋め込みました。

唯一のことは、それをいくつかのパスにコピーすることです。例としてデスクトップとしましょう。どうすればこれを達成できますか?私はすでにこれらを試してみた

How to copy file From Resources?

Read a file from a resource and write it to disk in C#

Write file from assembly resource stream to disk

をしかし、私はいつもトラブルに直面しています。例:

Takeover 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_ControlResources.Take_Over_ControlまたはProperties.Resources.Take_Over_Controlを置けば、GetManifestResourceStream部分で、私はいつもthrow new ArgumentException();にこだわっていない物質と...ですだから、resourcenullであり、それはStream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("Take_Over_Control");行に正しく設定されていません。

私が試した他の方法には問題があります。ここで何が間違っていますか?この埋め込みオーディオファイルを正しい方法でコピーする方法

+0

にあなたのリソースを返すために、権限受領者にその代わりにこのコードを使用することができます私...私は自分の質問に答えることができないことに気付かなかった!答えへの途中で! – mishamosher

+0

ああ、これを持っている:おっと!あなたの回答は以下の理由で投稿できませんでした: •評判が100未満のユーザーは、質問後8時間は自分の質問に答えられません。あなたは4時間で自己回答することができます。それまでは、コメントを使用するか、代わりに質問を編集してください。 – mishamosher

+0

私はこれらの答えをここに追加するために8時間の制限をパスすることを確認します。 – mishamosher

答えて

1

Resources.Designer.csファイルを探して、私はResourceManager.GetStreamを見た...今、私のクリックイベントでこれを使用します:

そして、それはデスクトップにWAVファイルをコピーするという正しい仕事をします。そしてまた...今私は反射から解放されています!

WAVファイルがVisual Studio 2010 C#.NET Framework 4クライアントプロファイルプロジェクトに追加されると、byte[]として保存されず、UnmanagedMemoryStreamという名前で保存されることに注意してください。このため、byte[]に変換するか、またはStreamResourceManagerを入力するだけで、ResourceManagerの方法が短くなります。

2

まず、あなたのWAVファイルが「ビルドアクション」プロパティの埋め込みリソースであることを確認しましたか?その場合は、WAVファイルへのパスが間違っているように見えます。ライン...

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

がMyProjectの名前出て、プロジェクト、およびリソースである

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

であるべきではWAVファイルが保存されているフォルダです。だから、これはあなたのwavファイルへのパスであれば、上記のコードが適用されます...「C:

+0

アジャー、それを得た。私のプロジェクト名は 'FilesOnResources'です。私は' FilesOnResources.Resources.Take_Over_Control'と 'FilesOnResources.Properties.Resources.Take_Over_Control'を試みましたが、うまくいきません。 – mishamosher

+0

さらに注意してください。私は、Resourcesフォルダが存在せず、EXEファイルしかない場合でもコードを動作させたいと思います。リソースフォルダが存在しません。 WAVファイルがEXEリソースに埋め込まれていることを思い出してください。そのため、リソースフォルダを必要とせずにそれをプルする方法が必要です。 – mishamosher

+0

また、リソースにアクセスできるかどうかを確認するためにいくつかのテストを行いました。私はSystem.Media.SoundPlayerを 'System.Media.SoundPlayer sp = new SoundPlayer(Properties.Resources.Take_Over_Control);'、そして 'sp.Play();'を介してリソースに行きました。それは再生されます! – mishamosher

0

に役立ちます\ MyProjectと\リソース\ Take_Over_Control.wav

ホープあなたは何をする必要はありません。Properties.Resources.ResourceManager.GetStream

あなたはVS.NETでリソースエディタを使用している場合は、ちょうどあなたがそれから生成されたリソースクラスを取得します。そこにあなたのwavファイルをドラッグします。そこから

、あなただけの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); 
+0

を参照してください。サウンドファイルで試してみましたか?確かに? 'byte []'として保存されていないので、 'UnmanagedMemoryStream'として保存されています...' byte [] 'に変換しようとしましたが、最後に' ResourceManager'が短くなりました – mishamosher

+0

OKストリームなので、さらに簡単になります。私はまだあなたがコンパイル時間のチェックを取得するので、生成されたクラスを使用する方が良いと思います。完全なサンプルコードで答えを更新してください。 –

+0

まだ2行目のコードが好きです:P。 'ストリームリソース= Properties.Resources.ResourceManager.GetStream(" Take_Over_Control "); 'と' Stream output = File.OpenWrite(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)+ "\\ Sound.wav"); ' – mishamosher

0

いくつかの回、このコードは、リソースにnullを取得:

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

が、我々はあなたが信じられないだろうストリーム変数

Stream resource = Properties.Resources.ResourceManager.GetStream("ResourceFileName") 
関連する問題