2

リソース ファイルをディスクに書き込もうとして問題が発生しました (すべてのリソース ファイルは同じプロジェクトとアセンブリの一部です)。

追加すると

var temp = Assembly.GetExecutingAssembly().GetManifestResourceNames();

string[]これは、次の形式でa を返します。

Gener.OptionsDialogForm.resources
Gener.ProgressDialog.resources
Gener.Properties.Resources.resources
Gener.g.resources
Gener.Resources.reusable.css
Gener.Resources.other.jpg

配列の最後の 2 つは、必要な 2 つのファイルのみですが、これが常に当てはまるという保証はないと思います。コードが変更されると、配列が別の順序で取得される可能性があるため、特定のインデックスでアイテムを明示的に呼び出すことはできません ( temp[4])

だから、私はできる

foreach (string item in Assembly
             .GetExecutingAssembly()
             .GetManifestResourceNames())
{
    if (!item.Contains("Gener.Resources."))
        continue;

    //Do whatever I need to do
}

しかし、これはただ恐ろしいです!このアプローチには別の問題があります。これは拡張子付きのファイル名を返しませんName。拡張子が何であるかはわかりません。

これは現在のコードです

    public void CopyAllFiles()
    {
        var files = Resources.ResourceManager.GetResourceSet(System.Globalization.CultureInfo.CurrentUICulture, true, true);
        //var temp = Assembly.GetExecutingAssembly().GetManifestResourceNames();

        foreach (DictionaryEntry item in files)
        {
            using (var resourceFileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Gener.Resources." + item.Key.ToString() + ".css")) // this won't work, I can't hard code .css as the extension could be different
            {
                Stream stream = new FileStream(this.DirPath, FileMode.Create, FileAccess.Write);
                resourceFileStream.CopyTo(stream);
                stream.Dispose();
            }             
        }
        files.Dispose();            
    }

しかし、これは...間違っているようです...これは他の人がこれを行う方法ですか?何かが欠けていると確信しており、そのようなタスクは一般的であり、より良い解決策がありますか?

4

2 に答える 2