C#: Внутренняя база данных файла в приложении

Я в настоящее время работаю над подобным Краске приложением WPF и теперь стою перед проблемой, как я позволяю моим пользователям сохранить созданные образы. Обычно я просто сохранил бы их на диск, но в этом приложении у меня есть требование, чтобы позже позволить пользователю создать большие "изображения" из уже созданных. Это все еще не было бы никакой проблемой с нормальным подходом файловой системы, но пользователь должен также смочь искать изображения определенными свойствами как категории/теги и т.д., и это было бы трудно с нормальным подходом файловой системы.

Таким образом, я думал о некоторых опциях, я имею для понимания, что я хочу и теперь хотел бы знать то, что Вы думаете о подходах или если Вы даже знаете лучший. Подходы:

  • Сохранение образов во внутренней базе данных приложения (через SQLite или что-то подобное)
  • Сохранение образов как нормальные файлы в файловой системе и сохраняет базу данных в приложении для ссылки на эти изображения (что происходит, если изображения были удалены пользователем?)
  • Сохранение образов как нормальные файлы в файловой системе без дополнительной базы данных в приложении (трудно для фильтрации их по категориям и т.д.)

Спасибо!

5
задан chrischu 22 February 2010 в 16:48
поделиться

5 ответов

Если дочерний процесс не является вашим собственным кодом, вы можете использовать этот код для поиска и уничтожения всех дочерних процессов:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Util {
    public static class ProcessExtensions {
        public static void KillDescendants(this Process processToNotKillYet) {
            foreach (var eachProcess in Process.GetProcesses()) {
                if (eachProcess.ParentPid() == processToNotKillYet.Id) {
                    eachProcess.KillTree();
                }
            }
        }

        public static void KillTree(this Process processToKill) {
            processToKill.KillDescendants();
            processToKill.Kill();
        }

        public static PROCESS_BASIC_INFORMATION Info(this Process process) {
            var processInfo = new PROCESS_BASIC_INFORMATION();
            try {
                uint bytesWritten;
                NtQueryInformationProcess(process.Handle,
                                          0,
                                          ref processInfo,
                                          (uint)Marshal.SizeOf(processInfo),
                                          out bytesWritten); // == 0 is OK
            }
            catch (Win32Exception e) {
                if (!e.Message.Equals("Access is denied")) throw;
            }

            return processInfo;
        }

        public static int ParentPid(this Process process) {
            return process.Info().ParentPid;
        }

        [DllImport("ntdll.dll")]
        private static extern int NtQueryInformationProcess(
            IntPtr hProcess,
            int processInformationClass /* 0 */,
            ref PROCESS_BASIC_INFORMATION processBasicInformation,
            uint processInformationLength,
            out uint returnLength);

        [StructLayout(LayoutKind.Sequential)]
        public struct PROCESS_BASIC_INFORMATION {
            public int ExitStatus;
            public int PebBaseAddress;
            public int AffinityMask;
            public int BasePriority;
            public int Pid;
            public int ParentPid;
        }
    }
}
-121--3867366-

Singleton Summary:

  • Большую часть времени обычный объект будет работать.
  • Будьте осторожны с одиночками.
  • Максимально локализовать взаимодействие

Хотя синглтоны - хорошая идея, я склонен просто реализовать нормальный объект и использовать его. Если важно, чтобы у меня был только один такой объект, я изменю конструктор, чтобы создать фатальное исключение при создании второго объекта. Различные одиночные модули, кажется, не так много делают, кроме добавления зависимости.

Я делаю это потому, что это легко, это работает, и когда в каком-то странном будущем мне нужно работать со вторым объектом в моем приложении, изменения сводятся к минимуму.

Я также люблю локализовать взаимодействие с моими «одиночными» объектами - поддерживать взаимодействие как можно в нескольких местах. Поэтому вместо каждого объекта, имеющего прямой доступ к синглтону, я опосредую все взаимодействие через свой объект «Приложение». По возможности объект приложения получает данные из «singleton» и передает их в качестве параметра методу в других объектах. Ответы от других объектов также могут быть обработаны и переданы в «singleton». Все это помогает, когда мне нужно внести изменения в объект «singleton», и когда я хочу повторно использовать другие объекты в другом приложении, которые могут не нуждаться или иметь возможность использовать исходный объект «singleton».

-121--3783549-

Многие программы (например, Aperture, Lightroom, Expression Media, чтобы назвать несколько) хранят свои образы на диске, а затем поддерживают кэш метаданных в базе данных. Это кажется наиболее разумным подходом для вашего приложения.

1
ответ дан 15 December 2019 в 06:24
поделиться

Вы можете сохранять файлы в файловой системе и сохранять или читать метаданные напрямую. Эта функция также доступна пользователю вне вашего приложения в Windows 7/Vista... Кажется, это называется Image tags. Вам придется разбирать XML.

Хороший пример: http://johndyer.name/post/2006/09/01/Quick-C-Vista-Photo-Tag-Reader.aspx

1
ответ дан 15 December 2019 в 06:24
поделиться

Я бы выбрал второй подход и использовал FileSystemWatcher для отслеживания изменений во время работы программы и запуска синхронизации во время запуска для отслеживания изменений с момента последнего запуска приложения.

SqlLite или SQL Compact Editio являются хорошими вариантами для локальной базы данных для отслеживания метаданных.

0
ответ дан 15 December 2019 в 06:24
поделиться

Конечно, можно хранить изображение в базе данных. Для экономии места можно хранить поток изображений так, как он сохраняется в файл. При считывании вы просто распаковываете изображение, используя функцию чтения потока.

Здесь нет проблем, характерных для двух других решений (удаление файлов, поиск файлов по категориям).

Вы можете сохранять файлы в файловой системе, создавая папки и подпапки на основе ваших категорий, но это не позволяет вам иметь более одной категории на файл.

0
ответ дан 15 December 2019 в 06:24
поделиться

Я считаю, что SQLITE будет хорошим выбором. BLOB версии 3 и более поздних версий полностью поддерживается, так что вы можете думать о SQLITE.

1
ответ дан 15 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: