Я в настоящее время работаю над подобным Краске приложением WPF и теперь стою перед проблемой, как я позволяю моим пользователям сохранить созданные образы. Обычно я просто сохранил бы их на диск, но в этом приложении у меня есть требование, чтобы позже позволить пользователю создать большие "изображения" из уже созданных. Это все еще не было бы никакой проблемой с нормальным подходом файловой системы, но пользователь должен также смочь искать изображения определенными свойствами как категории/теги и т.д., и это было бы трудно с нормальным подходом файловой системы.
Таким образом, я думал о некоторых опциях, я имею для понимания, что я хочу и теперь хотел бы знать то, что Вы думаете о подходах или если Вы даже знаете лучший. Подходы:
Спасибо!
Если дочерний процесс не является вашим собственным кодом, вы можете использовать этот код для поиска и уничтожения всех дочерних процессов:
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, чтобы назвать несколько) хранят свои образы на диске, а затем поддерживают кэш метаданных в базе данных. Это кажется наиболее разумным подходом для вашего приложения.
Вы можете сохранять файлы в файловой системе и сохранять или читать метаданные напрямую. Эта функция также доступна пользователю вне вашего приложения в Windows 7/Vista... Кажется, это называется Image tags. Вам придется разбирать XML.
Хороший пример: http://johndyer.name/post/2006/09/01/Quick-C-Vista-Photo-Tag-Reader.aspx
Я бы выбрал второй подход и использовал FileSystemWatcher для отслеживания изменений во время работы программы и запуска синхронизации во время запуска для отслеживания изменений с момента последнего запуска приложения.
SqlLite или SQL Compact Editio являются хорошими вариантами для локальной базы данных для отслеживания метаданных.
Конечно, можно хранить изображение в базе данных. Для экономии места можно хранить поток изображений так, как он сохраняется в файл. При считывании вы просто распаковываете изображение, используя функцию чтения потока.
Здесь нет проблем, характерных для двух других решений (удаление файлов, поиск файлов по категориям).
Вы можете сохранять файлы в файловой системе, создавая папки и подпапки на основе ваших категорий, но это не позволяет вам иметь более одной категории на файл.
Я считаю, что SQLITE будет хорошим выбором. BLOB версии 3 и более поздних версий полностью поддерживается, так что вы можете думать о SQLITE.