Почему я могу написать ОДИН элемент в моем файле Resource.resx? - PullRequest
0 голосов
/ 11 июня 2011

Я думал, что пишу 10 расширений файлов и связанные с ними значки в виде растрового изображения в файл ресурсов в цикле for. Странно, что в файл Resource.resx записывается только последнее расширение файла с его значком. Каким-то образом следующее расширение файла в цикле переписывает предыдущее, но ПОЧЕМУ? Я думал, что ресурс - это своего рода словарь с парой ключ / значение, где я могу добавлять столько, сколько хочу, так же, как и в конструкторе ресурсов ...

Что я не прав?

Мой код:

private void AddDocument()
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = true;

            DialogResult result = fileDialog.ShowDialog();
            if (result == DialogResult.OK)
            {
                for (int i = 0; i < fileDialog.FileNames.Length; i++)
                {
                    string absoluteFilePath = fileDialog.FileNames.GetValue(i).ToString();
                    byte[] file = File.ReadAllBytes(absoluteFilePath);
                    String fileExtension = Path.GetExtension(absoluteFilePath);

                    Bitmap gdiImage;

                    Document doc = new Document();
                    doc.DocumentData = file;
                    doc.DocumentName = fileDialog.SafeFileNames.GetValue(i).ToString();


                    if (TryIsFileExtensionExisting(fileExtension, out gdiImage))
                    {
                        // Filetype was saved before => Convert GDI Bitmap to wpf BitmapImage
                        doc.DocumentTypeImage = gdiImage.ConvertGDIImageToWPFBitmapImage();
                    }
                    else
                    {
                        BitmapImage wpfImage;
                        // Filetype is new => get Bitmap out of the Icon
                        Icon icon = IconFromFilePath(absoluteFilePath);
                        Bitmap bitmap = icon.ToBitmap();
                        wpfImage = bitmap.ConvertGDIImageToWPFBitmapImage();
                        doc.DocumentTypeImage = wpfImage;

                        // Save bitmap to resource
                        using (ResXResourceWriter writer = new ResXResourceWriter("TBM.Resource"))
                        {
                            writer.AddResource(fileExtension, bitmap);
                            writer.Generate();
                        }
                    }                    

                    DocumentList.Add(doc);
                }
                _documentService.AddDocumentsToPeriod(DocumentList, _parentId);
            }
        }

        private bool TryIsFileExtensionExisting(String fileExtension, out Bitmap wpfImage)
        {
            DictionaryEntry entry;
            using (ResXResourceReader reader = new ResXResourceReader ("TBM.Resource"))
            {
                entry = reader.Cast<DictionaryEntry>()
                                        .Where(x => x.Key.ToString()
                                        .Equals(fileExtension, StringComparison.CurrentCultureIgnoreCase))
                                        .FirstOrDefault();
            };            

            wpfImage = entry.Value as Bitmap;
            return entry.Key != null; 
        }

        private Icon IconFromFilePath(string filePath)
        {
            Icon result = null;
            try
            {
                result = Icon.ExtractAssociatedIcon(filePath);
                //'# swallow and return nothing. You could supply a default Icon here as well
            }
            catch
            {
            }
            return result;
        }

1 Ответ

1 голос
/ 11 июня 2011

Проблема здесь:

       using (ResXResourceWriter writer = new ResXResourceWriter("TBM.Resource"))
       {
           writer.AddResource(fileExtension, bitmap);
           writer.Generate();
       }

Каждый раз, когда вы создаете новый объект записи и записываете в него.Но у вас нет создания объекта записи, прочитанного из старого файла.Таким образом, вы перезаписываете каждый раз.Вы должны иметь возможность использовать другой конструктор и решить вашу проблему.

http://msdn.microsoft.com/en-us/library/system.resources.resxresourcewriter.aspx

...